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

use*_*312 21 python subprocess

我正在尝试编写一个使用该subprocess模块的小应用程序.

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

处理.请稍等...
输出为foo()

我怎么能用Popen.wait()或者这样做呢Popen.poll().我已经读过我需要使用的Popen.returncode,但我怎么能得到它来主动检查状态,我不知道.

onl*_*one 28

@ extraneon的回答有点倒退.无论wait()poll()该过程是否已结束返回进程的退出代码.如果进程仍在运行,则该poll()方法将返回None,并且该wait()方法将阻塞,直到进程退出:

请查看以下页面:https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

检查子进程是否已终止.设置并返回returncode属性.

Popen.wait()

等待子进程终止.设置并返回returncode属性.


ext*_*eon 27

两者wait()(有timeout指定的)并且如果进程尚未完成则返回,并且如果进程已经完成则poll()返回None一些不同的东西(我认为整数,退出代码,希望为0).

编辑:

wait()poll()有不同的行为:

  • wait (没有超时参数)将阻塞并等待进程完成.
  • wait使用timeout参数将等待timeout进程完成的秒数.如果它没有完成,它将抛出TimeoutExpired异常.如果您发现异常,那么欢迎您继续,或者wait再次访问.
  • poll总是马上回来.它有效地等待超时为0,捕获任何异常,并None在进程尚未完成时返回.
  • 无论使用哪种wait或者poll,如果该进程已经完成,POPEN对象returncode将被设置(否则就没有-你可以作为很容易地检查作为主叫waitpoll),并从函数的返回值也将是过程的返回码.

</编辑>

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

while myprocess.poll() is None:
    print("Still working...")
    # sleep a while
Run Code Online (Sandbox Code Playgroud)

请注意,如果bash脚本创建了大量输出,则必须使用communicate()或类似的东西来防止stdoutstderr被填充.

  • 这个答案是对的.检查@ onlynone的答案 (4认同)