1

以下代码正确完成,

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 中的错误吗?有什么解决方法吗?

4

1 回答 1

2

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

close_fds=True需要调用 Popen()。因为 Popen 做了pipe(2)and fork(2),所以不仅父进程而且子进程都必须关闭管道的输出端。仅在较新的 python 上, close_fds=True 似乎是默认值。

不管怎么说,还是要谢谢你 ;)

于 2013-02-22T11:17:29.030 回答