使用子进程wait()和poll()

时间:2010-06-08 09:03:51

标签: python subprocess

我正在尝试编写一个使用subprocess模块的小应用。

我的程序调用外部Bash命令,需要一些时间来处理。在此期间,我想向用户展示一系列消息:

  

处理。请稍候...
  输出是foo()

如何使用Popen.wait()Popen.poll()执行此操作。我已经读过我需要使用Popen.returncode,但我怎么能让它主动检查状态,我不知道。

2 个答案:

答案 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()poll()有不同的行为:

  • wait(没有超时参数)将阻止并等待该过程完成。
  • 具有timeout参数的
  • wait将等待timeout秒以完成该过程。如果它没有完成,它将抛出TimeoutExpired异常。如果您发现异常,欢迎您继续,或再次wait
  • poll总是立即返回。它有效地执行等待,超时为0,捕获任何异常,如果进程尚未完成,则返回None
  • 使用waitpoll,如果进程已完成,则将设置popen对象的returncode(否则为无 - 您可以像调用{{}一样轻松检查1}}或wait),函数的返回值也将是进程的返回码。

<强>&LT; /编辑&gt;

所以我觉得你应该这样做:

poll

请注意,如果bash脚本创建了大量输出,则必须使用while myprocess.poll() is None: print("Still working...") # sleep a while 或类似内容来阻止 stdout stderr 填充。< / p>