12

我很确定有人会使用 os.plock(op) 函数来做到这一点,但我不知道怎么做。另外,如果有更好的方法,我将不胜感激。代码片段非常受欢迎。

4

5 回答 5

14

Subprocess替换 os.popen、os.system、os.spawn、popen2 和 commands。管道的一个简单示例是:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

您还可以使用带有 flag=MAP_SHARED 的内存映射文件在进程之间共享内存。

多处理抽象了管道共享内存,并提供了更高级别的接口。取自处理文档:

from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()
于 2008-10-20T16:26:05.163 回答
8

查看 python 2.6 中新增的多处理模块(也可用于早期版本的pyprocessing

这是文档中的一个示例,该示例说明了使用管道传递信息的示例:

from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()
于 2008-10-20T16:30:34.250 回答
5

这几乎与 Python 无关!这是 Unix 进程间通信的经典示例。一个不错的选择是使用popen()在父进程和子进程之间打开管道,并沿着管道来回传递数据/消息。

看看这个subprocess模块,它可以在产生子进程的同时自动设置必要的管道。

于 2008-10-20T15:59:25.343 回答
2

你有两个选择:os.popen*os模块中,或者你可以使用subprocess模块达到同样的效果。Python 手册有关于popensubprocess的漂亮文档和示例。

于 2008-10-20T16:03:59.127 回答
1

如果您正在执行低级操作系统分叉并且真的想避免使用管道,那么也可以使用共享内存映射文件。这不像使用subprocesspopen管道那么好,但包括完整性的答案......

这里有一个完整的例子,但基本上你可以结合os文件处理和mmap模块:

import mmap, os, tempfile
fd, tmpfile = tempfile.mkstemp()
os.write(fd, '\x00' * mmap.PAGESIZE)
os.lseek(fd, 0, os.SEEK_SET)
child_pid = os.fork()
if child_pid:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_READ)
    os.waitpid(child_pid, 0)
    child_message = buf.readline()
    print(child_message)
    os.close(fd)
else:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE)
    buf.write('testing\n')
    os.close(fd)
于 2018-06-14T10:02:08.640 回答