gpt4 book ai didi

python - 以正确的方式终止一个进程及其子进程以 subprocess.popen 开始(windows 和 linux)

转载 作者:行者123 更新时间:2023-11-28 19:23:33 28 4
gpt4 key购买 nike

我正在努力处理一些我从 Popen 开始的流程,这些流程启动了子流程。当我在终端中手动启动这些进程时,如果我发送 CTRL+C,每个进程都会按预期终止。但是在使用 subprocess.Popen 的 python 程序中运行任何终止进程的尝试只会摆脱父进程而不是它的子进程。

我尝试了 .terminate() ..kill() 以及 ..send_signal() 和 signal.SIGBREAK、signal.SIGTERM,但在每种情况下我都只是终止了父进程。

通过这个父进程,我可以重现错误行为:

#!/usr/bin/python

import time
import sys
import os
import subprocess
import signal

if __name__ == "__main__":
print os.getpid(), "MAIN: start a process.."
p = subprocess.Popen([sys.executable, 'process_to_shutdown.py'])
print os.getpid(), "MAIN: started process", p.pid
time.sleep(2)
print os.getpid(), "MAIN: kill the process"
# these just terminate the parent:
#p.terminate()
#p.kill()
#os.kill(p.pid, signal.SIGINT)
#os.kill(p.pid, signal.SIGTERM)
os.kill(p.pid, signal.SIGABRT)
p.wait()
print os.getpid(), "MAIN: job done - ciao"

现实生活中的子进程是来自 Django 的 manage.py,它生成一些子进程并等待 CRTL-C。但以下示例似乎也有效:

#!/usr/bin/python

import time
import sys
import os
import subprocess

if __name__ == "__main__":

timeout = int(sys.argv[1]) if len(sys.argv) >= 2 else 0

if timeout == 0:
p = subprocess.Popen([sys.executable, '-u', __file__, '13'])
print os.getpid(), "just waiting..."
p.wait()

else:
for i in range(timeout):
time.sleep(1)
print os.getpid(), i, "alive!"
sys.stdout.flush()

print os.getpid(), "ciao"

所以我的问题简而言之:我如何终止第一个示例中的进程并摆脱子进程?在 Windows 上 os.kill(p.pid, signal.CTRL_C_EVENT) 似乎在某些情况下有效,但正确的方法是什么?终端是如何做到的?

最佳答案

正如 Henri Korhonen 在评论中提到的那样,分组过程应该有所帮助。此外,如果您在 Windows 上并且这是启动 Windows 应用程序的 Cygwin Python,则 Cygwin Python 似乎无法杀死子项。对于这些情况,您需要运行 TASKKILL。 TASKKILL 还采用组参数。

关于python - 以正确的方式终止一个进程及其子进程以 subprocess.popen 开始(windows 和 linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18783552/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com