python3 利用subprocess关闭进程

subprocess模块可以生成新的进程,连接到它们的input/output/error管道,同时获取它们的返回码。

我们利用subprocess.getoutput(cmd)函数:执行cmd命令,返回值为命令执行的输出结果(字符串类型);
注:执行失败,不会抛出异常。

我们要关闭一个进程,首先要找到这个进程的pid号,pgrep能获取到指定程序名的进程号 。

然后调用subprocess.run()去执行kill命令,shell=True代表使用操作系统自带的shell。

示例如下:main.py是要杀死的程序

import subprocess

ret = subprocess.getoutput("pgrep -f main.py")

subprocess.run("kill -9 " + ret + "", shell=True)

 

### 如何正确退出或终止子进程 为了确保 `subprocess` 模块中的子进程能够被安全地关闭,可以采用多种方法来实现这一目标。一种常见的做法是利用 `Popen.terminate()` 或者更强制的方式如 `Popen.kill()` 方法。 对于某些情况下的进程管理需求,可能还需要处理僵尸进程的问题,这可以通过设置 `preexec_fn=os.setsid` 来创建一个新的会话[^2]。当希望向特定的子进程发送信号时,如果是在类 Unix 系统上,则可考虑使用 `os.killpg(os.getpgid(proc.pid), signal.SIGTERM)` 的方式;而在 Windows 平台上则适用如下所示的方法: ```python import os import subprocess import sys def terminate_process(child_pid): try: if sys.platform.startswith('win'): subprocess.check_output(f"Taskkill /PID {child_pid} /F", shell=True)[^1] else: os.kill(child_pid, 9) # SIGKILL on Unix-like systems except Exception as e: print(e) # 获取当前进程ID以便于测试 current_pid = os.getpid()[^3] # 创建一个示例子进程用于演示目的 proc = subprocess.Popen(['echo', 'hello'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 终止该子进程 terminate_process(proc.pid) ``` 上述代码片段展示了如何跨平台地结束由 `subprocess.Popen` 启动的子进程。需要注意的是,在实际应用中应当谨慎对待强行杀死进程的行为,因为这样可能导致数据丢失等问题。通常建议先尝试优雅地请求程序停止运行再采取进一步措施。 #### 关闭标准输入/输出流 除了直接操作操作系统级别的命令外,还可以通过控制 Popen 对象的标准 I/O 流来进行更加精细的操作。例如,调用 `communicate()` 可以等待子进程完成并读取其输出,而不会造成死锁风险。此外,也可以显式地关闭这些管道连接以促使子进程尽快退出。 ```python stdout, stderr = proc.communicate() print(stdout.decode()) if stderr: print("Errors occurred:", stderr.decode()) ``` 此段代码说明了怎样与子进程交互以及获取它的执行结果,这对于调试非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值