杰瑞科技汇

taskkill命令 python

taskkill 是 Windows 系统下的命令行工具,用于终止一个或多个进程,在 Python 中,我们通常通过 subprocess 模块来执行这个命令。

taskkill命令 python-图1
(图片来源网络,侵删)

核心方法:使用 subprocess 模块

subprocess 模块是 Python 中用来创建子进程、连接它们的输入/输出/错误管道,并获取它们的返回状态的标准模块,这是执行系统命令最推荐的方式。


subprocess.run() (推荐,Python 3.5+)

这是最现代、最灵活的方法,也是官方推荐的首选。

按进程ID (PID) 终止进程

这是最精确的方式。

import subprocess
# 假设我们要终止进程ID为 1234 的进程
pid_to_kill = 1234
# 构建命令
# /F 表示强制终止,即使程序没有响应
# /PID 指定要终止的进程ID
command = f"taskkill /F /PID {pid_to_kill}"
try:
    # 执行命令
    # check=True 会在命令返回非零退出码(即失败)时抛出 CalledProcessError 异常
    # capture_output=True 会捕获标准输出和标准错误
    # text=True 会将输出解码为文本
    result = subprocess.run(command, check=True, capture_output=True, text=True, shell=True)
    print(f"命令执行成功: {result.stdout}")
    print(f"进程 {pid_to_kill} 已被终止。")
except subprocess.CalledProcessError as e:
    print(f"命令执行失败,返回码: {e.returncode}")
    print(f"错误信息: {e.stderr}")
except FileNotFoundError:
    print("错误: taskkill 命令未找到,请确保您在 Windows 系统上运行此脚本。")

按进程名称 (Image Name) 终止进程

如果你想通过程序名(如 notepad.exe)来终止所有匹配的进程。

taskkill命令 python-图2
(图片来源网络,侵删)
import subprocess
# 假设我们要终止所有名为 "notepad.exe" 的进程
process_name = "notepad.exe"
# 构建命令
# /IM 指定要终止的进程映像名称
# /F 表示强制终止
command = f"taskkill /F /IM {process_name}"
try:
    result = subprocess.run(command, check=True, capture_output=True, text=True, shell=True)
    print(f"命令执行成功: {result.stdout}")
    print(f"所有名为 '{process_name}' 的进程已被终止。")
except subprocess.CalledProcessError as e:
    print(f"命令执行失败,返回码: {e.returncode}")
    print(f"错误信息: {e.stderr}")
except FileNotFoundError:
    print("错误: taskkill 命令未找到,请确保您在 Windows 系统上运行此脚本。")

subprocess.Popen()

如果你需要更细粒度的控制,比如实时读取命令的输出流,或者不等待命令完成就继续执行,可以使用 Popen

import subprocess
pid_to_kill = 1234
command = f"taskkill /F /PID {pid_to_kill}"
# 使用 Popen 启动进程
# stdout=subprocess.PIPE, stderr=subprocess.PIPE 用于捕获输出
# text=True 用于自动解码
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 等待命令执行完成,并获取返回码
return_code = process.wait()
# 获取输出和错误
stdout, stderr = process.communicate()
if return_code == 0:
    print(f"命令执行成功: {stdout}")
    print(f"进程 {pid_to_kill} 已被终止。")
else:
    print(f"命令执行失败,返回码: {return_code}")
    print(f"错误信息: {stderr}")

重要参数详解

参数 全称 说明
/F Force 强制终止,如果省略此参数,taskkill 会先尝试请求应用程序正常关闭,如果应用程序无响应,则终止失败,加上 /F 可以强制关闭,即使程序没有响应。强烈建议在脚本中使用此参数。
/PID Process ID 指定要终止的进程的唯一标识符 (PID),这是最精确的方式。
/IM Image Name 指定要终止的进程的可执行文件名notepad.exe),如果指定了 通配符,则会匹配所有进程。
/T Tree 终止指定进程和由它启动的所有子进程
/FI Filter 指定筛选器,用于根据属性(如 STATUS eq NOT RESPONDING)选择要终止的进程。

进阶用法:结合 psutil

虽然 taskkill 直接有效,但在 Python 中,有一个更强大、跨平台的第三方库叫做 psutil (Process and System utilities),它允许你用 Python 的原生方式来管理系统进程,并且可以跨平台(Windows, macOS, Linux)工作。

首先需要安装 psutil

pip install psutil

使用 psutil 终止进程:

taskkill命令 python-图3
(图片来源网络,侵删)
import psutil
import time
# 1. 找到所有名为 "notepad.exe" 的进程
target_processes = []
for proc in psutil.process_iter(['name']):
    try:
        # proc.info 是一个字典,包含了进程信息
        if proc.info['name'] == 'notepad.exe':
            target_processes.append(proc)
    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
        # 处理进程可能在遍历过程中已经结束或无法访问的情况
        pass
if not target_processes:
    print("没有找到名为 'notepad.exe' 的进程。")
else:
    print(f"找到了 {len(target_processes)} 个 'notepad.exe' 进程。")
    # 2. 遍历并终止这些进程
    for proc in target_processes:
        try:
            print(f"正在尝试终止 PID 为 {proc.pid} 的进程...")
            proc.terminate()  # 发送 SIGTERM (在Windows上是CTRL+C事件),尝试优雅关闭
            # 等待最多3秒,让进程正常关闭
            proc.wait(timeout=3)
            print(f"进程 {proc.pid} 已成功终止。")
        except psutil.TimeoutExpired:
            # 如果进程在3秒后仍未关闭,则强制杀死
            print(f"进程 {proc.pid} 未在超时时间内关闭,正在强制终止...")
            proc.kill()  # 发送 SIGKILL (在Windows上是强制终止)
            print(f"进程 {proc.pid} 已被强制终止。")
        except psutil.NoSuchProcess:
            print(f"进程 {proc.pid} 已经不存在了。")
        except psutil.AccessDenied:
            print(f"没有权限终止进程 {proc.pid}。")

总结与对比

方法 优点 缺点 适用场景
subprocess.run() 简单直接,是Python标准库的一部分,无需额外安装。 依赖系统命令(taskkill),只在Windows上有效;处理复杂交互(如实时输出)不如Popen灵活。 大多数简单的、一次性的进程终止任务。
subprocess.Popen() 功能强大,可以与子进程进行复杂的交互,控制输入输出流。 代码稍显复杂,需要手动管理进程状态和等待。 需要实时获取命令输出、后台运行命令或进行复杂进程交互的场景。
psutil 跨平台(Windows, macOS, Linux),功能更丰富(获取CPU、内存、网络等信息),Pythonic的API,更安全(如处理权限)。 需要额外安装第三方库。 需要跨平台支持、需要获取进程详细信息、或者希望用纯Python逻辑管理进程的复杂应用。

推荐选择:

  • 如果只是简单的在 Windows 上用 Python 终止一个进程,使用 subprocess.run() 是最快、最直接的方法。
  • 如果你的脚本需要跨平台运行,或者需要做更复杂的进程管理,强烈推荐使用 psutil 库,因为它更健壮、功能更强大。
分享:
扫描分享到社交APP
上一篇
下一篇