使用Python subprocess库运行命令时如何杀死开启的子进程

本文探讨了在使用Python的subprocess库运行命令时,如何根据`shell=False`和`shell=True`两种情况有效地终止子进程。当`shell=False`,可以直接调用`kill()`或`terminate()`方法;而在`shell=True`情况下,由于创建了外壳进程,需要通过进程组ID使用`os.killpg()`来杀死包括外壳进程在内的所有进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以subprocess.Popen为例:

实例时构建subprocess.Popen时会有一个shell参数,默认为False

 shell=False时,命令参数必须为列表形式。

p = subprocess.Popen(['sleep', '10'], shell=False)

此时如果需要杀死进程,只需要调用kill()方法或terminate()方法,

kill()方法会强制终止进程,并发送SIGKILL信号;

import subprocess
import time

# 启动进程
p = subprocess.Popen(['sleep', '10'], shell=False)

# 等待 3 秒钟
time.sleep(3)

# 终止进程
p.kill()

# 等待进程结束
p.wait()

 shell=True时,命令参数可使用常规的linux命令行形式。

p = subprocess.Popen('sleep 10', shell=True)

使用 shell=True 会创建一个外壳进程来解释命令行参数,而外壳进程又会创建一个子进程来执行实际的命令。因此,要杀死这种类型的进程,需要杀死外壳进程和子进程两个进程。

在 Unix 系统中,可以使用 os.killpg() 函数杀死进程组中的所有进程。进程组 ID 可以通过 Popen() 方法的 preexec_fn 参数设置。

import subprocess
import os
import signal

# 启动进程
p = subprocess.Popen('sleep 10', shell=True, preexec_fn=os.setsid)

# 等待 3 秒钟
time.sleep(3)

# 杀死进程组中的所有进程(在 Unix 系统中)
os.killpg(os.getpgid(p.pid), signal.SIGTERM)

# 等待进程结束
p.wait()

此时可以正常的杀死进程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值