我使用以下方式运行子进程:
p = subprocess.Popen("subprocess",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
此子进程可以在 stderr 上出现错误时立即退出,或者继续运行。我想检测其中任何一种情况 - 后者需要等待几秒钟。
我试过了:
SECONDS_TO_WAIT = 10
select.select([],
[p.stdout, p.stderr],
[p.stdout, p.stderr],
SECONDS_TO_WAIT)
但它只是返回:
([],[],[])
在任何一种情况下。我能做什么?
最佳答案
您是否尝试过使用 Popen.Poll() 方法。你可以这样做:
p = subprocess.Popen("subprocess",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
time.sleep(SECONDS_TO_WAIT)
retcode = p.poll()
if retcode is not None:
# process has terminated
这将导致您始终等待 10 秒,但如果失败案例很少见,这将在所有成功案例中摊销。
编辑:
怎么样:
t_nought = time.time()
seconds_passed = 0
while(p.poll() is not None and seconds_passed < 10):
seconds_passed = time.time() - t_nought
if seconds_passed >= 10:
#TIMED OUT
这有一个忙着等待的丑陋,但我认为它完成了你想要的。
另外再看一下选择调用文档,我想你可能想按如下方式进行更改:
SECONDS_TO_WAIT = 10
select.select([p.stderr],
[],
[p.stdout, p.stderr],
SECONDS_TO_WAIT)
由于您通常希望从 stderr 中读取数据,因此您想知道它何时有可读取的内容(即失败案例)。
我希望这会有所帮助。
关于Python,Popen 和 select - 等待进程终止或超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/337863/