【问题标题】:[Windows,python]How to make process started by subprocee.Popen() to automatically terminate when the parent process is dead?[Windows,python]如何让subprocess.Popen()启动的进程在父进程死亡时自动终止?
【发布时间】:2019-12-10 06:36:55
【问题描述】:
在我的 python 脚本中,我使用以下方法启动了一些进程:
p1 = subprocess.Popen('p1.exe')
p2 = subprocess.Popen('p2.exe')
当这两个子进程启动时,当父进程因为某些错误而死时,它们不会被杀死。
我希望这三个进程,父进程,p1和p2同时退出.也就是说,其中任何一个终止都会使所有其他终止。我如何在 Windows 上进行管理? Linux 呢?
【问题讨论】:
标签:
python
windows
subprocess
【解决方案1】:
假设父进程死于异常(而不是像分段错误这样的硬错误),一个简单的try/finally 可以保证进程在退出块时终止(通过执行从结束,异常冒泡,return 提前离开函数等):
p1 = p2 = None # Ensure names exist
try:
p1 = subprocess.Popen('p1.exe')
p2 = subprocess.Popen('p2.exe')
# ... stuff that runs in tandem with processes
finally:
for p in (p1, p2):
if p is not None:
p.terminate()
如果您希望子进程更干净地关闭,一个简单的with 语句就足够了(std 句柄将被关闭,您将等待每个进程):
with subprocess.Popen('p1.exe') as p1, subprocess.Popen('p2.exe') as p2:
# ... stuff that runs in tandem with processes
如果要启动进程并在父进程启动时运行,则您应该使用the atexit module 将它们注册为在主进程退出时终止:
import atexit
p1 = subprocess.Popen('p1.exe')
atexit.register(p1.terminate)
p2 = subprocess.Popen('p2.exe')
atexit.register(p2.terminate)
# ... rest of your code