当前位置: 首页 > 知识库问答 >
问题:

不要等待子进程,但稍后检查returncode

长孙智刚
2023-03-14

我正在编写一个运行许多子进程的脚本。脚本应该能够运行它们所有的内容,然后在一个循环中检查如果它们已经完成。

不是开始一个,等它完成,然后开始下一个。

sp1 = subprocess.Popen(["sleep 60", shell=True)
sp2 = subprocess.Popen(["sleep 10", shell=True)
sp3 = subprocess.Popen(["sleep 80", shell=True)

sp1_done = False
sp2_done = False
sp3_done = False
while not sp1_done and not sp2_done and not sp3_done:
    if sp1.returncode and not sp1_done:
        print("sp1 done")
        sp1_done = True
    if sp2.returncode and not sp2_done:
        print("sp2 done")
        sp2_done = True
    if sp3.returncode and not sp3_done:
        print("sp3 done")
        sp3_done = True

print("all done")

但是像这样,脚本等待sp1完成。

我如何运行多个子进程,而不是等待它们完成,而是检查它们是否完成(例如,通过检查返回代码)?

共有1个答案

农存
2023-03-14

您需要对每个启动的子进程使用poll方法。并且检查returncode不是None:

 while ....  # as written
     sp1.poll()
     sp2.poll()
     sp3.poll()
     if sp1.returncode is not None and not sp1_done:
          .... # as written
     ... # as written
 类似资料:
  • 我希望能够在后台启动一大批工作,而不使用bash脚本,并继续在同一个内核上工作。这有可能吗?我对架构变化持开放态度,但我的库的最终用户可能不是很复杂。 表示ipython单元 python 3.7。6从JupyterLab内部

  • 如果你想等待 process::Child 完成,就必须调用 Child::wait,这会返回一个 process::ExitStatus。 use std::process::Command; fn main() { let mut child = Command::new("sleep").arg("5").spawn().unwrap(); let _result = chi

  • 问题内容: 我的目标很简单:启动rsync并不要等待。 Debian上的Python 2.7.9 样例代码: (我之所以注释掉执行命令,只是因为我实际上将所有试验都保留在代码中,以便我知道自己已经做过什么以及尚未完成什么。显然,我会以正确的方式运行脚本行未注释。) 这是怎么回事…我可以在服务器上观看传输,完成传输后,我会在屏幕上看到“完成”字样。 我想发生的是在发出命令并立即开始传输后立即打印“完

  • 问题内容: 我正在编写一个Python程序,用于在Linux服务器上运行用户上传的任意代码(因此,在最坏的情况下,就是不安全,错误和崩溃的代码)。除了安全性问题外,我的目标是确定代码(可能以任何语言编写,编译或解释的)是否将正确的内容写入,以及是否将给定输入的其他文件写入程序的。之后,我需要向用户显示结果。 目前,我的解决办法是使用产卵子进程与文件句柄,和。后面的文件句柄包含了操作过程中的程序读取

  • 我在blender中有一个python脚本 我试着用通勤,但还是没用: 此shell脚本在MacOS上非常有效(在更改路径后),并且在使用时会等待 但是在Windows上,我在Blender中运行下面的python脚本,然后一旦它到达子进程行就会打开并运行shell脚本,而Blender不等待它完成,它只在控制台中打印而不等待Git Bash完成。有人帮忙吗?

  • 问题内容: 对于子进程,和函数可用于暂停当前进程的执行,直到子进程退出。但是此功能不能用于非子进程。 是否有另一个函数可以等待任何进程的退出? 问题答案: 什么都不等于。通常的做法是使用轮询,寻找返回值-1和的,表明进程已经一去不复返了。