我正在尝试使用subprocess.Popen来生成几个子进程,并使用psutil.wait_procs来等待它们完成。所有进程似乎都在运行,但wait_procs似乎没有起作用。我的回调没有被执行,我从第一个进程得到一个timeoput消息,即使我设置了timeout = None。我想我一定做错了:(
这是启动多个子进程的脚本:
(plot) $ cat multi-run.py
#! /usr/bin/env python
import subprocess
import psutil
import random
def on_completion(proc):
print("Pid %d completed" % proc.pid)
random.seed(1234)
procs = []
for i in range(2):
soh = open('out%s.txt' % i, 'w')
seh = open('err%s.txt' % i, 'w')
sleepfor = random.randrange(1, 4)
myargs = ['./subproc.py', '%s' % sleepfor, 'SO%s' % i , 'SE%s' % i]
proc = subprocess.Popen(myargs, stdout=soh, stderr=seh)
procs.append(proc)
psutil.wait_procs(procs, timeout=None, callback=on_completion)
这是子进程的subproc.py脚本:
(plot) $ cat subproc.py
#! /usr/bin/env python
import time
from sys import argv, stderr
print("Sleeping for %s seconds" % argv[1])
print("Second arg to stdout: '%s'" % argv[2]);
print("Third arg to stderr: '%s'" % argv[3], file=stderr);
time.sleep(float(argv[1]))
两者都应位于同一目录中。我跑的时候
$ ./multi-run.py
我得到以下输出:
(plot) $ ./multi-run.py
Traceback (most recent call last):
File "./multi-run.py", line 18, in <module>
psutil.wait_procs(procs, timeout=None, callback=on_completion)
File "/Users/XXXX/anaconda/envs/plot/lib/python3.4/site-packages/psutil/__init__.py", line 1561, in wait_procs
check_gone(proc, max_timeout)
File "/Users/XXXX/anaconda/envs/plot/lib/python3.4/site-packages/psutil/__init__.py", line 1524, in check_gone
returncode = proc.wait(timeout=timeout)
File "/Users/XXXX/anaconda/envs/plot/lib/python3.4/subprocess.py", line 1561, in wait
raise TimeoutExpired(self.args, timeout)
subprocess.TimeoutExpired: Command '['./subproc.py', '2', 'SO0', 'SE0']' timed out after 0.5 seconds
我正在运行Python 3.4.5和psutil 5.0.1
答案 0 :(得分:2)
你的错误是你没有传递psutil.wait_procs()一个psutil.Process()实例的列表,这是它所期望的。而是传递subprocess.Popen()实例。 你的脚本没有错误输出,因为顺便说一下subprocess.Popen()也公开了一个wait()方法,这是psutil.wait_procs()在内部依赖的方法,但它只是一个意外。 这表明psutil中的弱点虽然应该更好,但如果它们不是psutil.Process的实例,请检查传递的实例并立即输出错误。我将提交一个错误并在psutil中修复它。