最稳妥方式是用 subprocess.popen 启动多个独立脚本,显式传参、存入列表统一管理,避免阻塞;windows 需加 create_no_window,路径用绝对路径,日志需进程隔离。

用 subprocess 启动多个独立脚本最稳妥
想让几个 Python 脚本真正并行跑(不是顺序执行),subprocess 是最直接、可控性最强的方式。它不依赖第三方库,兼容所有 Python 版本,还能捕获输出、控制超时、处理退出码。
常见错误是直接用 os.system() 或 os.popen() —— 它们会阻塞主线程,或者无法可靠获取子进程状态。
- 用
subprocess.Popen()而非subprocess.run():后者默认会等待完成,前者才真正“发出去就不管” - 记得加
shell=False(默认值),避免路径含空格或特殊字符时出错 - 如果脚本需要从当前环境继承变量,显式传
env=os.environ,别依赖默认行为 - 启动后建议存入列表,方便后续统一检查
.poll()或调用.wait()
import subprocess
procs = [
subprocess.Popen(['python', 'script_a.py']),
subprocess.Popen(['python', 'script_b.py']),
subprocess.Popen(['python', 'script_c.py'])
]
for p in procs:
p.wait() # 可选:等全部结束
用 threading 跑轻量级脚本要小心 GIL
threading 看起来简单,但只适合 I/O 密集型脚本(比如调 API、读文件、等网络响应)。CPU 密集型任务(如数值计算、解析大 JSON)在线程里还是串行的,因为 CPython 的 GIL 锁住了。
另一个坑是:线程内启动的脚本如果也用 threading 或 multiprocessing,可能引发嵌套异常或资源泄漏。
- 别用
threading.Thread(target=os.system, args=('python script.py',)):os.system会阻塞线程 - 正确做法是在线程里调用
subprocess.Popen,把启动逻辑包进去 - 线程数别盲目设多,超过 10 个容易耗尽系统句柄或触发 shell 并发限制
- 务必给线程加
daemon=True,否则主程序退出时子线程还在跑,可能卡住终端
concurrent.futures 适合有返回值的批量任务
如果你不只是想“启动”,还想等结果、收集输出、统一处理异常,concurrent.futures.ProcessPoolExecutor 或 ThreadPoolExecutor 更合适。它封装了底层复杂度,自带超时、回调、异常传播机制。
注意:用 ProcessPoolExecutor 才能绕过 GIL,真正并行;但进程启动开销比线程大,小脚本反而更慢。
- 传给
submit()的函数不能是临时定义的 lambda 或嵌套函数,必须可被 pickle 序列化 - 如果脚本本身是独立文件,推荐写一个包装函数,用
subprocess.run调它,再把这个函数 submit 出去 -
max_workers设为None不等于“无限”,实际受系统 CPU 核心数和内存限制 - 别在
as_completed()循环里直接 print,容易乱序;先存结果再统一输出
Windows 下双击运行 + 多脚本容易卡死
在 Windows 上,用资源管理器双击 .py 文件启动脚本,背后其实是 pythonw.exe(无控制台),这时候再用 subprocess.Popen 启另一个脚本,如果没加 creationflags=subprocess.CREATE_NO_WINDOW,新窗口会一闪而过,还可能报错 WindowsError: [Error 6] The handle is invalid。
更隐蔽的问题是:某些杀毒软件会拦截批量进程创建,尤其当多个脚本同时访问同一配置文件或日志路径时,可能触发文件锁或权限拒绝。
- 开发阶段一律用命令行跑:
python launcher.py,别依赖双击 - Windows 上启动子进程时,显式加
creationflags=subprocess.CREATE_NO_WINDOW避免弹窗干扰 - 多个脚本共用日志?别都往同一个
app.log里写,要么加进程 ID 后缀,要么用RotatingFileHandler并设delay=True - 路径里有中文或空格?全用
pathlib.Path().resolve()转成绝对路径再传给subprocess
事情说清了就结束
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











