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

核心方法:使用 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)来终止所有匹配的进程。

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 终止进程:

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库,因为它更健壮、功能更强大。
