
在 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+)