我有一个脚本,它在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?
发布于 2020-05-14 01:10:34
这不是对os.execvp的更改,而是对os.pipe的更改。注意,the Python 3 documentation说“新的文件描述符是non-inheritable",但the Python 2 documentation并非如此。正如该链接中所解释的,要使其在Python3中工作,请执行os.set_inheritable(writer, True)。(顺便说一句,这意味着您的os.close(reader)是冗余的,因为它也是不可继承的,所以您可以删除该行。)
https://stackoverflow.com/questions/61779902
复制相似问题