Python:subprocess.Popen和subprocess.call挂起
当我使用subprocess.Popen或subprocess.call执行生成大量输出的命令行时,python脚本会挂起,但奇怪的是,在等待一段时间后,当脚本处于挂起状态时,我发现cmd行命令的作业已经完成,只有剧本挂了出来Python:subprocess.Popen和subprocess.call挂起,python,Python,当我使用subprocess.Popen或subprocess.call执行生成大量输出的命令行时,python脚本会挂起,但奇怪的是,在等待一段时间后,当脚本处于挂起状态时,我发现cmd行命令的作业已经完成,只有剧本挂了出来 subprocess.call(cmd, shell = True) #OR subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True) # HANGS HE
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脚本中出现
非常感谢根据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"
我不明白为什么您的第一行不起作用-因为没有
stdin
/stdout
/stderr
重定向,所以不需要阻止
第二个应该会阻止进程
但由于您的子进程正确终止,我看不出阻塞的原因。你确定它真的终止了吗?使用
子流程没有问题。如果你不使用子流程.PIPE
,调用,而OP不是。它没有解释为什么print
语句的输出不显示在父语句中Popen()
不等待子进程,即使子进程在尝试使用完整缓冲区写入管道时被阻止。