首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: subprocess.Popen和subprocess.call挂起

Python: subprocess.Popen和subprocess.call挂起
EN

Stack Overflow用户
提问于 2011-11-10 18:11:51
回答 2查看 17.2K关注 0票数 16

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

代码语言:javascript
复制
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脚本才会出现这种情况。

非常感谢

EN

回答 2

Stack Overflow用户

发布于 2011-11-10 19:29:38

根据python文档,subprocess.call运行该命令并等待其完成,因此它相当于先运行subprocess.Popen,然后运行Popen.wait

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

代码语言:javascript
复制
import subprocess
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
stdout, stderr = process.communicate()
print "show something after subprocess"
票数 16
EN

Stack Overflow用户

发布于 2011-11-10 21:42:19

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

第二个进程应该阻塞,如果进程

  1. 期望通过标准输入或
  2. 向标准输出发送的数据多于管道在未读取输出时所能容纳的数据。

但是当你的子进程正确终止时,我看不到阻塞的原因。你确定它真的会终止吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8077868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档