如何等待subprocess的开始?

我执行一个进程(使用Popen),过了一段时间,这个进程执行一个subprocess。
我想要做的是等待subprocess生成,然后继续执行我的脚本。

我发现的唯一方法是使用psutil和轮询,直到进程有孩

process = psutil.Process(subprocess.Popen(command).pid) while 0 == len(process.children()): time.sleep(0.2) 

有没有更好的方式比对孩子进行投票? 也许等待一些事件?

我使用的是Windows 10。

我认为没有更好的解决方案。 但是你可以优化过程调用:

 process = psutil.Popen(command) 

Popen类

一个更方便的接口stdlib subprocess.Popen。 它启动一个子进程,你完全像使用subprocess.Popen一样处理它,另外它还提供了psutil.Process类的所有方法。 […]

另外,您可以使用等待功能编写自己的事件。 等待更多的CPU饿了,但它更响应。 看这里例如。 但这取决于你的Python版本。

根据你的意见,你可以让你在启动它的子进程的时候写一些东西给STDOUT,你可以很容易的使用Popen.check_output()来从父进程中获取STDOUT字符串。 例如,如果你的子Subprocess started\ncommand )写入STDOUT Subprocess started\n ,你可以纯粹通过subprocess Subprocess started\n模块来完成:

 import subprocess response = subprocess.check_output(command) if response.rstrip() == "Subprocess started": print("Woo! Our sub-subprocess was started...") 

但是,如果你的command返回多个输出,你可能必须清除那些你不感兴趣的东西。你可以通过观察你的子Subprocess started的STDOUT来实现前面提到的Subprocess started字符串,如下所示:

 import subprocess proc = subprocess.Popen(command, stdout=subprocess.PIPE) while True: # a loop to read our subprocess STDOUT line = proc.stdout.readline().rstrip() # read line-by-line if line == "Subprocess started": print("Woo! Our sub-subprocess was started...") break # no need to read the STDOUT anymore 

如果您希望从您的command接收错误消息(例如,无法启动子进程或类似的东西),您也可以捕获STDERR(或将其管理到STDOUT)。

如果第一个孩子可以在产生自己的孩子后写一些东西,主脚本可以等待第一个写入。

这里是一个工作的例子(Windows环境Python 2.7):

Python主脚本:

 python = r"C:\Python27\python.exe" script = r"...\foo.py" deb = time.clock() child = subprocess.Popen([ python, script], stdout = subprocess.PIPE) cr = child.stdout.read() fin = time.clock() print fin-deb, cr 

Python(简体)第一个孩子:

 time.sleep(2) # add a delay # the child is supposed to be spawned here print "Done" sys.stdout.flush() # flushes stdout so that caller gets it immediately time.sleep(8) # just to make the child live a little longer 

主脚本输出是:

 2.12153148707 Done 

证明第一次睡眠后主脚本继续。

如果您可以控制子进程,则可以在父进程和子进程之间使用一些同步原语,例如使用套接字或文件,否则在繁忙循环中轮询子进程children()是唯一可以执行的操作,只需确保退出while循环之后或者你的程序可能会无限期地挂起来。