Python3 中 os.execvp() 的文件描述符有什么变化吗?

问题描述 投票:2回答:1

我有一个脚本,在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 与旧的、预期的行为?

python python-3.x pipe exec file-descriptor
1个回答
1
投票

这不是对 os.execvp 而是改变为 os.pipe. 注意到 Python 3文档 说 "新的文件描述符是 不可继承",但 Python 2文档 不会。正如在该链接中所解释的那样,要使它在 Python 3 中工作,请做以下操作 os.set_inheritable(writer, True). 顺便说一下,这意味着你的 os.close(reader) 是多余的,因为它也不是可继承的,所以你可以去掉这一行)。)

© www.soinside.com 2019 - 2024. All rights reserved.