我正在使用以下命令启动子流程:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

然而,当我试图用以下方法杀人时:

p.terminate()

p.kill()

该命令一直在后台运行,所以我想知道如何才能真正终止该进程.

请注意,当我使用以下命令运行该命令时:

p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)

当发出p.terminate()时,它确实成功终止.

推荐答案

使用process group可向组中的所有进程发送信号.为此,您应该将session id附加到派生的/子进程的父进程,在本例中它是一个shell.这将使其成为进程的组长.所以现在,当一个信号被发送给进程组领导者时,它就会被传输到该组的所有子进程.

以下是代码:

import os
import signal
import subprocess

# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before  exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                       shell=True, preexec_fn=os.setsid) 

os.killpg(os.getpgid(pro.pid), signal.SIGTERM)  # Send the signal to all the process groups

Python相关问答推荐

在使用Guouti包的Python中运行MPP模型时内存不足

使文本输入中的文本与标签中的文本相同

如何使用上下文管理器创建类的实例?

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

输出中带有南的亚麻神经网络

DataFrames与NaN的条件乘法

NumPy中条件嵌套for循环的向量化

如何在BeautifulSoup/CSS Select 器中处理regex?

未调用自定义JSON编码器

python sklearn ValueError:使用序列设置数组元素

Polars Group by描述扩展

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

数据框,如果值在范围内,则获取范围和

如何在Airflow执行日期中保留日期并将时间转换为00:00

我什么时候应该使用帆布和标签?

每次查询的流通股数量

高效生成累积式三角矩阵

用由数据帧的相应元素形成的列表的函数来替换列的行中的值

根据过滤后的牛郎星图表中的数据计算新系列

Django更新视图未更新