Python 了解subprocess.TimeoutExpired,是否希望在超时发生后终止子进程
有人能帮助我理解timeout参数在子流程模块中是如何工作的,以及如何正确使用subprocess.TimeoutExpired异常吗 我的用例是我有一个主运行程序,它运行子进程作为其重复例程的一部分。已知子进程有时会挂起。我想防止这件事阻碍一切 我在想,我可以使用timeout参数让孩子只运行这么长的时间。然而,在我的示例程序中,下面的行为并不是我所期望的。当parent.py运行时,它确实启动了child.py,我可以看到child.py的输出正在增加。在4s parent.py确实获得subprocess.TimeoutExpired异常之后,来自child.py的输出继续出现。这让我相信child.py进程实际上并没有被杀死。文件似乎暗示它将被杀死,但是: 超时参数被传递给Popen.wait()。如果超时过期,子进程将被终止,然后再次等待。子进程终止后,将重新引发TimeoutExpired异常 那么我该如何解决这个问题呢?当我收到超时异常时,我是否需要以某种方式杀死我的子进程 谢谢你的帮助 parent.pyPython 了解subprocess.TimeoutExpired,是否希望在超时发生后终止子进程,python,subprocess,Python,Subprocess,有人能帮助我理解timeout参数在子流程模块中是如何工作的,以及如何正确使用subprocess.TimeoutExpired异常吗 我的用例是我有一个主运行程序,它运行子进程作为其重复例程的一部分。已知子进程有时会挂起。我想防止这件事阻碍一切 我在想,我可以使用timeout参数让孩子只运行这么长的时间。然而,在我的示例程序中,下面的行为并不是我所期望的。当parent.py运行时,它确实启动了child.py,我可以看到child.py的输出正在增加。在4s parent.py确实获得su
#!/usr/bin/env python3
import os
import sys
import subprocess
p = subprocess.Popen("/path/to/python3 /path/to/child.py", shell=True)
try:
p.wait(timeout=4)
except subprocess.TimeoutExpired:
print("we got a timeout. exiting")
sys.exit(1)
child.py
#!/usr/bin/env python3
import os
import sys
import time
for i in range(200):
print("i is {}".format(i))
time.sleep(1)
看起来您确实需要添加呼叫
p.terminate()
在父进程中的
sys.exit
之前——根据当前文档,您引用的位仅适用于子进程。调用,这是而不是您在此处使用的内容。摘自文档:
如果进程在超时秒后未终止,则引发TimeoutExpired异常。捕获此异常并重试等待是安全的。
这意味着您可以捕获异常,除非您杀死该进程(或python),否则该进程将继续执行。在你的情况下,因为你正在做
sys.exit(1)
然后python本身将被终止,Popen对象将被垃圾收集。您没有参考文档,您发布的文档似乎是模块函数之一call
,check\u output
或check\u call
。您可以。如果子脚本是Python脚本;将其作为模块导入并使用多处理
,未来
运行更为灵活。仅退出父进程不会杀死其子进程。