如何通过Python向Linux终端发送多条命令?按序执行Python脚本需求
用Python按顺序执行Linux终端中的Python脚本
没问题,这事儿用Python的subprocess模块就能轻松搞定——它是Python和系统终端交互的标准工具,完美支持按顺序阻塞执行命令,确保前一个脚本跑完再启动下一个。
核心思路
我们要做的就是遍历你的脚本列表,对每个脚本调用subprocess.run()方法,这个方法默认会等待命令执行完成后再继续代码逻辑,刚好贴合你的需求。如果某个脚本执行失败,还可以灵活选择中断后续流程或者继续执行。
完整代码示例
假设你有一个按顺序执行的脚本路径列表,直接用下面的代码就能实现:
import subprocess # 替换成你的脚本路径列表,按你想要的顺序排列 script_list = [ "/home/user/scripts/step1_process_data.py", "/home/user/scripts/step2_analyze.py", "/home/user/scripts/step3_generate_report.py" ] for script_path in script_list: print(f"🔍 开始执行脚本: {script_path}") try: # 执行脚本,等待完成,失败则抛出异常 execution_result = subprocess.run( ["python3", script_path], check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 打印脚本的执行输出 print(f"✅ 脚本 {script_path} 执行成功!输出内容:\n{execution_result.stdout}\n") except subprocess.CalledProcessError as error: print(f"❌ 脚本 {script_path} 执行失败!错误信息:\n{error.output}\n") # 可选:如果某个脚本失败就停止后续执行,注释掉下面的break可以继续执行剩余脚本 break
关键参数解释
这里的几个参数是确保功能正常的核心:
["python3", script_path]:用列表形式传入命令,避免shell注入风险,比直接写字符串更安全;check=True:当脚本执行返回非0状态码(也就是执行失败)时,自动抛出CalledProcessError异常,方便我们捕获错误;stdout=subprocess.PIPE+stderr=subprocess.STDOUT:把脚本的标准输出和错误输出都捕获到execution_result.stdout里,方便我们查看执行细节;text=True:让输出以字符串形式返回,而不是字节流,直接打印更方便。
额外场景处理
1. 需要在特定工作目录执行脚本
如果你的脚本依赖某个工作目录的文件,可以加上cwd参数指定执行路径:
subprocess.run( ["python3", script_path], check=True, cwd="/home/user/workspace", # 指定脚本执行的工作目录 stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True )
2. 使用虚拟环境执行脚本
如果你的脚本需要用虚拟环境的Python解释器,直接换成虚拟环境的python路径就行:
# 比如虚拟环境在/home/user/venv下 subprocess.run( ["/home/user/venv/bin/python", script_path], check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True )
3. 必须使用shell执行(不推荐)
如果你的场景需要shell特性(比如环境变量加载、管道命令),可以设置shell=True,但要注意不要传入不可信的脚本路径,避免shell注入风险:
subprocess.run( f"python3 {script_path}", shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True )
注意事项
- 确保系统里的
python3命令可用,或者换成你的Python解释器绝对路径(比如/usr/bin/python3.9); - 脚本路径尽量用绝对路径,避免因工作目录变化导致找不到脚本;
- 如果脚本需要执行权限,用
python3 script.py的方式不需要额外设置chmod +x,直接就能运行。
内容的提问来源于stack exchange,提问作者KAMAL
相关产品推荐
相关产品推荐

