
在 Python 中,subprocess.Popen
是启动和管理第三方程序的强大工具。以下是关键知识点和使用示例:
基础用法
import subprocess
# 启动程序(阻塞式等待)
process = subprocess.Popen(["notepad.exe"])
process.wait() # 等待程序结束
# 启动程序(非阻塞)
process = subprocess.Popen(["calc.exe"]) # 后台运行计算器
print("程序在后台运行,继续执行脚本...")
核心参数说明
args 命令列表(推荐)或字符串(需 shell=True)
stdout 重定向输出(subprocess.PIPE 捕获输出)
stderr 重定向错误(subprocess.STDOUT 合并到 stdout)
stdin 提供输入
cwd 设置工作目录(默认当前目录)
shell 通过系统 shell 执行(Windows 必需 .bat/.cmd,有安全风险)
creationflags Windows 专用标志(如隐藏窗口)
实用场景示例
1. 捕获输出
python
# 危险!可能被注入
subprocess.Popen(f"dir {user_input}", shell=True)
# 安全替代方案
subprocess.Popen(["dir", sanitized_input])
2. 实时读取输出流
python
with subprocess.Popen(
["python", "-u", "real_time_script.py"], # -u 禁用缓冲
stdout=subprocess.PIPE,
text=True,
bufsize=1 # 行缓冲
) as proc:
for line in proc.stdout:
print(f"实时输出: {line.strip()}")
3. 隐藏控制台窗口(Windows)
python
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.Popen(
["my_app.exe"],
startupinfo=startupinfo,
creationflags=subprocess.CREATE_NO_WINDOW
)
常见问题解决
程序不退出:检查是否在等待子进程(使用
wait()
/communicate()
)中文乱码:设置
encoding="utf-8"
或系统对应编码权限问题:以管理员身份运行 Python 脚本
提示:对于简单命令,可考虑更高级的
subprocess.run()
(Python 3.5+)