Popen.communicate(timeout=2)
是否有可能引发TimeoutExpired
,即使我声称Popen.poll() is not None
和Popen.wait(2)
不会引发异常?
修改:docs建议使用以下代码段:
proc = subprocess.Popen(...)
try:
outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
但这只会引发ProcessLookupError: [Errno 3] No such process
。这是有道理的,因为我已经通过poll
和wait
终止了此过程。
答案 0 :(得分:1)
是。如果孩子产生自己的子过程是可能的。 Popen.communicate()
可能会在仅等待孩子的Popen.wait()
之后返回。请参阅Python subprocess' check_call()
vs check_output()
。
注意:proc.kill()
可能不会终止整个进程树。请参阅How to terminate a python subprocess launched with shell=True
。