如何通过shell脚本并行运行两个Python脚本并存储返回值到变量
双Python脚本并行执行并捕获返回值的实现方案
说明:以下实现均使用Python标准库完成,无需安装任何第三方依赖,返回值完全匹配要求的0/1取值规则。
核心实现逻辑
提到的脚本返回值为0/1,对应两种常见的返回场景:
- 脚本通过
sys.exit(0)/sys.exit(1)传出退出状态,这是独立脚本执行时最通用的返回值形式 - 脚本将0/1作为打印内容输出到标准输出
两种场景均可通过子进程调度的方式实现并行执行和值捕获。
方法1:简洁线程池调度实现(推荐)
使用concurrent.futures线程池提交两个脚本的执行任务,代码可读性高、异常处理完善,适合绝大多数常规场景。
import sys import subprocess from concurrent.futures import ThreadPoolExecutor def run_script(script_path: str) -> int: # 调用当前环境对应的Python解释器执行目标脚本 exec_result = subprocess.run( [sys.executable, script_path], capture_output=True, text=True ) # 若返回值是脚本退出码,直接返回exit状态 return exec_result.returncode # 并行提交两个执行任务 with ThreadPoolExecutor(max_workers=2) as executor: task1 = executor.submit(run_script, "script1.py") task2 = executor.submit(run_script, "script2.py") # 等待任务执行完成,将结果存入指定变量 x = task1.result() y = task2.result()
- 因为
subprocess.run属于IO阻塞型操作,用线程池的资源开销远低于进程池,完全可以实现两个脚本的真正并行运行 sys.executable会自动匹配当前运行环境的Python解释器路径,避免不同环境下解释器找不到的问题- 若返回值是脚本打印的stdout内容,只需将
run_script的返回逻辑修改为return int(exec_result.stdout.strip())即可
方法2:原生子进程启动实现(更灵活可控)
直接通过subprocess.Popen启动两个独立子进程,并行启动无额外等待逻辑,适合需要细粒度控制进程状态的场景。
import subprocess import sys # 非阻塞启动两个脚本的独立子进程 proc1 = subprocess.Popen([sys.executable, "script1.py"]) proc2 = subprocess.Popen([sys.executable, "script2.py"]) # 等待两个进程全部执行结束,直接获取退出码存入变量 x = proc1.wait() y = proc2.wait()
- 两个子进程从启动时刻开始完全独立并行运行,不存在串行等待的逻辑
- Python脚本如果抛出未捕获的异常,解释器会自动以退出码1结束进程,和要求的0/1返回值规则完全匹配
- 若需要读取脚本打印的返回值,可在
Popen中添加stdout=subprocess.PIPE参数,将wait()替换为communicate()方法读取标准输出内容,转成整数后存入对应变量即可
内容的提问来源于stack exchange,提问作者Shivika Patel
相关产品推荐
相关产品推荐

