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

2024-05-16 19:09:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Processing. Please wait...
The output is foo()

如何使用Popen.wait()Popen.poll()来完成此操作。我读到我需要使用Popen.returncode,但是我不知道如何让它主动检查状态。


Tags: 模块the用户命令程序bash应用程序消息
2条回答

@extraneon的回答有点倒退。如果进程完成,wait()poll()都返回进程的退出代码。如果进程仍在运行,poll()方法将返回None,并且wait()方法将阻塞,直到进程退出:

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

Popen.poll()

Check if child process has terminated. Set and return returncode attribute.

Popen.wait()

Wait for child process to terminate. Set and return returncode attribute.

同时指定^{}(指定timeout)和^{}如果进程尚未完成,则返回None;如果进程已完成,则返回不同的结果(我认为是整数,退出代码,希望是0)。

编辑

^{}^{}有不同的行为:

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

编辑

所以我觉得你应该做些什么:

while myprocess.poll() is None:
    print("Still working...")
    # sleep a while

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

相关问题 更多 >