我使用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脚本中。
非常感谢
答案 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
重定向,所以不需要阻止。
第二个应该阻止进程
但是当您的子进程正确终止时,我也看不到阻塞的原因。你确定它真的终止了吗?