Python subprocess.Popen 打开第三方程序

 zhangy  2025-06-05 14:36:25  29  6  0

Python6.jpg

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


发布评论  
您至少需输入5字最多输入1000字(登录用户才可以评论)
评论内容