当python进程被杀死时杀死子进程?

发布于 2024-08-08 17:12:34 字数 233 浏览 1 评论 0原文

我正在编写一个启动子进程的 python 程序(使用 Popen)。 我正在读取子进程的标准输出,进行一些过滤,然后写入 主进程的标准输出。

当我终止主进程(cntl-C)时,子进程继续运行。 我如何也杀死子进程?子进程可能会运行很长时间。

语境: 我一次只启动一个子进程,我正在过滤它的标准输出。 用户可能决定中断以尝试其他事情。

我是 python 新手,我正在使用 windows,所以请温柔一点。

I am writing a python program that lauches a subprocess (using Popen).
I am reading stdout of the subprocess, doing some filtering, and writing to
stdout of main process.

When I kill the main process (cntl-C) the subprocess keeps running.
How do I kill the subprocess too? The subprocess is likey to run a long time.

Context:
I'm launching only one subprocess at a time, I'm filtering its stdout.
The user might decide to interrupt to try something else.

I'm new to python and I'm using windows, so please be gentle.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冷情妓 2024-08-15 17:12:34

Windows没有信号,所以不能使用信号模块。但是,当按下 Ctrl-C 时,您仍然可以捕获 KeyboardInterrupt 异常。

像这样的事情应该让你继续:

import subprocess

try:
    child = subprocess.Popen(blah)
    child.wait() 

except KeyboardInterrupt:
    child.terminate()

Windows doesn't have signals, so you can't use the signal module. However, you can still catch the KeyboardInterrupt exception when Ctrl-C is pressed.

Something like this should get you going:

import subprocess

try:
    child = subprocess.Popen(blah)
    child.wait() 

except KeyboardInterrupt:
    child.terminate()
子栖 2024-08-15 17:12:34

subprocess.Popen 对象带有一个kill 和一个终止方法(不同之处在于发送给进程的信号)。

signal.signal 允许您安装信号处理程序,您可以在其中调用子进程的 Kill 方法。

subprocess.Popen objects come with a kill and a terminate method (differs in which signal you send to the process).

signal.signal allows you install signal handlers, in which you can call the child's kill method.

笑红尘 2024-08-15 17:12:34

您可以使用 python atexit 模块。

例如:

import atexit

def killSubprocess():
    mySubprocess.kill()

atexit.register(killSubprocess)

You can use python atexit module.

For example:

import atexit

def killSubprocess():
    mySubprocess.kill()

atexit.register(killSubprocess)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文