2013-01-21 89 views
6

我试图让一个脚本的输出,它使用Python的subprocess.Popen喜欢如下Python的POPEN()。stdout.read()挂

process = Popen(command, stdout=PIPE, shell=True) 
exitcode = process.wait() 
output = process.stdout.read() # hangs here 

它挂在第三行,只有当我运行它作为一个python脚本,我不能在python shell中重现这一点。

其他脚本只显示几个字,我假设它不是缓冲区问题。

有没有人知道我在做什么错在这里?

+0

如果你在'command'手动执行命令,它会产生输出吗? –

回答

0

您可能要使用.communicate()而不是.wait().read()。使用stdout=PIPE和/或stderr=PIPE

警告这将死锁和子进程产生足够的输出到管道,使得它阻止等待操作系统管缓冲区,接受:注意有关subprocess文档页面上的警告wait()更多数据。使用communicate()来避免这种情况。

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

+0

感谢您的回答。我刚刚意识到我已经阅读了文档的一部分..我正在做的是在'while process.poll()中实时获取stdout(无):脚本运行时的循环,上面的代码是一个剥离版本。但是,我猜这是因为类似的死锁问题而挂着...... – lyomi

0

read()方法返回前等待EOF。

您可以:

  • 等待子进程死亡,然后阅读()将返回。
  • 使用readline()如果你的输出被分解成行(如果没有输出行,仍然会挂起)。
  • 使用从F返回至多N个字节的os.read(F,N),但是如果管道为空(除非在fd上设置了O_NONBLOCK),它仍会阻塞。