Python:subprocess.Popen和subprocess.call挂起

时间:2011-11-10 10:11:51

标签: python

我使用subprocess.Popen或subprocess.call时遇到问题,当我使用subprocess.Popen或subprocess.call来执行生成大量输出的命令行时,python脚本会挂起,但是等待一段时间之后有什么奇怪的,脚本处于挂起状态,我发现cmd行命令的作业已经完成,只有脚本被挂起。

subprocess.call(cmd, shell = True)
#OR
subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True)
# HANGS HERE
print "show something after subprocess"

请注意,最后一次打印永远不会执行,但实际上已经执行了cmd。

另请注意,cmd与串口相关,因此当我插入串行电缆时,一切都会变好,最后一次打印状态就会被执行。但是当我使用终端时,即使插入了串口,一切都很好,它只发生在python脚本中。

非常感谢

2 个答案:

答案 0 :(得分:12)

根据python文档,subprocess.call运行命令并等待它完成,因此它等同于subprocess.Popen后跟Popen.wait

但是,Popen.wait方法文档明确警告缓冲区溢出问题,建议使用Popen.communicate代替。因此,您正在寻找的解决方案应该是:

import subprocess
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
stdout, stderr = process.communicate()
print "show something after subprocess"

答案 1 :(得分:2)

我不明白为什么你的第一行不起作用 - 因为没有stdin / stdout / stderr重定向,所以不需要阻止。

第二个应该阻止进程

  1. 通过stdin或
  2. 预期数据
  3. 向stdout发送的数据多于管道可以保存的数据。
  4. 但是当您的子进程正确终止时,我也看不到阻塞的原因。你确定它真的终止了吗?