我在 Python27 中遇到了问题,close_fds所以在做了一些研究后,我发现了这个例子:
from subprocess import Popen, PIPE, STDOUT
p1 = Popen(['cat'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['grep', 'a'], stdin=p1.stdout, stdout=PIPE)
p1.stdin.write("aaaaaaaaaaaaaaaa\n")
p1.stdin.close()
p2.stdout.read()
我的问题是我不明白为什么p1.stdin保持开放。p1不是子级,p2因此p2不应继承任何p1资源,除非p1.stdout明确传递。close_fds=True此外,为什么设置p2可以解决问题?这里是这样写的:
如果 close_fds 为 true,则在执行子进程之前,将关闭除 0、1 和 2 之外的所有文件描述符。
因此,即使我能够理解和之间的继承,p1也不应该被关闭,因为它是标准输入 (1)。p2p1.stdinclose_fds=True