我有一个脚本,在Python-2下工作得相当好。它使用了 os.pipe()
来创建一个管道,然后将管道写面的描述符传递给子进程。
reader, writer = os.pipe()
pid = os.fork()
if pid == 0:
# Child
os.close(reader)
os.execvp('command', ['command', '-o', '/dev/fd/%d' % writer])
...
在Python-2中,上面的操作是有效的,子进程向指定的文件描述符写入 -- 允许父进程读取它。
在Python-3下,子进程抱怨说无法打开这个 /dev/fd/4
-- 这意味着,描述符由于某种原因没有传递给子代。这个原因是什么 -- -- 是否有可能调用 os.execvp
与旧的、预期的行为?
这不是对 os.execvp
而是改变为 os.pipe
. 注意到 Python 3文档 说 "新的文件描述符是 不可继承",但 Python 2文档 不会。正如在该链接中所解释的那样,要使它在 Python 3 中工作,请做以下操作 os.set_inheritable(writer, True)
. 顺便说一下,这意味着你的 os.close(reader)
是多余的,因为它也不是可继承的,所以你可以去掉这一行)。)