我在 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)。p2
p1.stdin
close_fds=True