我正在尝试编写一个使用subprocess
模块的小应用。
我的程序调用外部Bash命令,需要一些时间来处理。在此期间,我想向用户展示一系列消息:
处理。请稍候...
输出是foo()
如何使用Popen.wait()
或Popen.poll()
执行此操作。我已经读过我需要使用Popen.returncode
,但我怎么能让它主动检查状态,我不知道。
答案 0 :(得分:28)
@ extraneon的回答有点倒退。如果进程已完成,wait()
和poll()
都会返回进程的退出代码。如果进程仍在运行,poll()
方法将返回None
,并且wait()
方法将阻塞,直到进程退出:
请查看以下页面:https://docs.python.org/3.4/library/subprocess.html#popen-objects
Popen.poll()
检查子进程是否已终止。设置并返回returncode属性。
Popen.wait()
等待子进程终止。设置并返回returncode属性。
答案 1 :(得分:26)
如果流程尚未完成,则 wait()
(指定timeout
)和poll()
都会返回None
,如果流程,则会返回不同的内容已经完成了(我想一个整数,退出代码,希望是0)。
修改:
wait
(没有超时参数)将阻止并等待该过程完成。wait
将等待timeout
秒以完成该过程。如果它没有完成,它将抛出TimeoutExpired
异常。如果您发现异常,欢迎您继续,或再次wait
。poll
总是立即返回。它有效地执行等待,超时为0,捕获任何异常,如果进程尚未完成,则返回None
。wait
或poll
,如果进程已完成,则将设置popen对象的returncode
(否则为无 - 您可以像调用{{}一样轻松检查1}}或wait
),函数的返回值也将是进程的返回码。<强>&LT; /编辑&gt; 强>
所以我觉得你应该这样做:
poll
请注意,如果bash脚本创建了大量输出,则必须使用while myprocess.poll() is None:
print("Still working...")
# sleep a while
或类似内容来阻止 stdout 或 stderr 填充。< / p>