以下代码正确完成,
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
医生说,
警告如果子进程生成足够的输出到 stdout 或 stderr 管道,从而阻塞等待 OS 管道缓冲区接受更多数据,这将死锁。使用communicate() 来避免这种情况。
但在这种情况下,不会生成任何输出。为什么会死锁?
我正在使用 Linux,并尝试了 python2.5 和 2.6。
--
编辑
我还在 MacOSX 上尝试了 python2.7.1 和 3.2.3。结果如下
- 2.5.2(linux) -> 死锁
- 2.6.6(linux) -> 死锁
- 2.7.1(osx) -> 死锁
- 3.2.3(osx)->好的!
这是旧 python 中的错误吗?有什么解决方法吗?