以下代码正确完成,
import subprocess
p = subprocess.Popen("cat", stdin=subprocess.PIPE)
p.stdin.close()
p.wait()
print p.returncode
但是代码永远不会结束。
import subprocess
p1 = subprocess.Popen("cat", stdin=subprocess.PIPE)
p2 = subprocess.Popen("cat", stdin=subprocess.PIPE)
p1.stdin.close()
p1.wait()
p2.stdin.close()
p2.wait()
print p1.returncode, p2.returncode
doc说,
警告如果子进程生成足够的内容,这将会死锁 输出到stdout或stderr管道,以阻止等待 OS管道缓冲区接受更多数据。使用communic()来避免这种情况。
但在这种情况下,不会生成任何输出。 为什么会陷入僵局?
我正在使用Linux,并尝试过python2.5和2.6。
-
修改
我还在MacOSX上尝试过python2.7.1和3.2.3。结果如下
这是旧python中的错误吗?有没有解决方法?
答案 0 :(得分:2)
Finnaly,我自己注意到了答案。
调用Popen()需要 close_fds=True
。
因为Popen执行pipe(2)
和fork(2)
,所以不仅父进程而且子进程必须关闭管道的输出端。
只有较新的python,close_fds = True似乎是默认的。
非常感谢;)