Python子进程wait()在mavericks和Yosemite上的表现不同

时间:2014-11-10 22:15:34

标签: python-2.7 subprocess osx-yosemite

我最近升级到优胜美地。并且一些Python脚本悬而未决,曾经在Mavericks上运行。我的版本是2.7.8。我创建了一个测试用例:

import subprocess
cat = subprocess.Popen(['top', '-l', '1'],
                            stdout=subprocess.PIPE,
                            )
cat.wait()

在Maverics上运行,但在Yosemite上挂起。当我在优胜美地中断时,我看到以下追溯。

Traceback (most recent call last):
    File "test.py", line 5, in <module>
      cat.wait()
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1376, in wait
      pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 476, in _eintr_retry_call
      return func(*args)
    KeyboardInterrupt

任何暗示我做错了什么?

1 个答案:

答案 0 :(得分:2)

您似乎需要致电communicate()。来自Python documentation

  

<强> Popen.wait()

     

等待子进程终止。设置并返回returncode属性。

     

警告:使用stdout=PIPE和/或stderr=PIPE时会出现死锁,子进程会为管道生成足够的输出   块等待OS管道缓冲区接受更多数据。使用   communicate()要避免这种情况。