Python 了解subprocess.TimeoutExpired,是否希望在超时发生后终止子进程

Python 了解subprocess.TimeoutExpired,是否希望在超时发生后终止子进程,python,subprocess,Python,Subprocess,有人能帮助我理解timeout参数在子流程模块中是如何工作的,以及如何正确使用subprocess.TimeoutExpired异常吗 我的用例是我有一个主运行程序,它运行子进程作为其重复例程的一部分。已知子进程有时会挂起。我想防止这件事阻碍一切 我在想,我可以使用timeout参数让孩子只运行这么长的时间。然而,在我的示例程序中,下面的行为并不是我所期望的。当parent.py运行时,它确实启动了child.py,我可以看到child.py的输出正在增加。在4s parent.py确实获得su

有人能帮助我理解timeout参数在子流程模块中是如何工作的,以及如何正确使用subprocess.TimeoutExpired异常吗

我的用例是我有一个主运行程序,它运行子进程作为其重复例程的一部分。已知子进程有时会挂起。我想防止这件事阻碍一切

我在想,我可以使用timeout参数让孩子只运行这么长的时间。然而,在我的示例程序中,下面的行为并不是我所期望的。当parent.py运行时,它确实启动了child.py,我可以看到child.py的输出正在增加。在4s parent.py确实获得subprocess.TimeoutExpired异常之后,来自child.py的输出继续出现。这让我相信child.py进程实际上并没有被杀死。文件似乎暗示它将被杀死,但是:

超时参数被传递给Popen.wait()。如果超时过期,子进程将被终止,然后再次等待。子进程终止后,将重新引发TimeoutExpired异常

那么我该如何解决这个问题呢?当我收到超时异常时,我是否需要以某种方式杀死我的子进程

谢谢你的帮助

parent.py

#!/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脚本;将其作为模块导入并使用
多处理
未来
运行更为灵活。仅退出父进程不会杀死其子进程。