📜  python 发送 sigint 到子进程 - Python (1)

📅  最后修改于: 2023-12-03 15:04:15.411000             🧑  作者: Mango

Python发送SIGINT到子进程

在Python中,有时我们需要通过发送SIGINT信号来停止正在运行的子进程。本文将介绍如何在Python中实现这一目标。

subprocess模块

Python的subprocess模块允许我们在Python程序中运行外部命令,并与该命令进行交互。在本文中,我们将使用该模块来启动子进程并发送SIGINT信号。

实现方法

首先,我们需要导入subprocess模块。

import subprocess

接下来,我们需要定义将要运行的命令。在本例中,我们将使用ping命令。

command = ["ping", "www.google.com"]

这将在子进程中运行ping www.google.com命令。

现在,我们需要使用subprocess.Popen()函数启动子进程,并将其存储在一个变量中。我们还将指定SIGINT信号的句柄函数。

def interrupt_handler(signum, frame):
    proc.send_signal(signal.SIGINT)

proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
signal.signal(signal.SIGINT, interrupt_handler)

这将启动子进程,并在其输出的情况下接收子进程的输出。我们还定义了一个interrupt_handler()函数,该函数将发送SIGINT信号给子进程。

现在,我们可以等待子进程完成。如果我们需要立即停止子进程,我们只需要发送SIGINT信号。

try:
    outs, errs = proc.communicate(timeout=15)
    print(outs.decode())
except subprocess.TimeoutExpired:
    proc.send_signal(signal.SIGINT)

outs, errs = proc.communicate()
print(outs.decode())

在这个例子中,我们使用了timeout参数,以便在一定时间内等待子进程完成。如果超时时间到了而子进程仍未完成,则将发送SIGINT信号以停止该进程。

总结

通过使用Python的subprocess模块和信号处理技巧,我们可以在Python程序中非常方便地发送SIGINT信号到任意正在运行的子进程中。