python Popen.wait()多个管道上的死锁 - 为什么?

时间:2013-02-22 04:45:01

标签: python linux unix operating-system pipe

以下代码正确完成,

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。结果如下

  • 2.5.2(linux) - >死锁
  • 2.6.6(linux) - >死锁
  • 2.7.1(osx) - > daedlock
  • 3.2.3(osx) - > OK!

这是旧python中的错误吗?有没有解决方法?

1 个答案:

答案 0 :(得分:2)

Finnaly,我自己注意到了答案。

调用Popen()需要

close_fds=True。 因为Popen执行pipe(2)fork(2),所以不仅父进程而且子进程必须关闭管道的输出端。 只有较新的python,close_fds = True似乎是默认的。

非常感谢;)