Linux下如何在不同目录并行运行同一组Python脚本?
问题分析与解决方法
原代码的核心问题
- 语法错误:
_name_和_main_必须是双下划线的__name__和__main__,这个错误会导致多进程池无法正确初始化,最终仅主进程执行第一个任务就终止。 - 路径不一致:第二个
os.system调用里的路径是/home/vishnuk/xyz/...,和第一个路径的/home/user/xyz/...不统一,会导致找不到脚本。 - os.chdir的局限性:虽然子进程的工作目录是独立的,但切换目录后如果后续操作出错,会增加调试难度,不如直接给命令指定工作目录更可靠。
修正后的代码
import os import time from multiprocessing import Pool import subprocess def par(input_dir): work_dir = f"/home/user/xyz/{input_dir}" # 先检查工作目录是否存在 if not os.path.isdir(work_dir): print(f"Error: Directory {work_dir} does not exist") return print(f"start process:{input_dir}") # 执行预处理脚本,指定工作目录为work_dir pre_process_cmd = ["python", "/home/user/xyz/model/Preprocessing_directory/Driver.py", "metadata.json"] result1 = subprocess.run(pre_process_cmd, cwd=work_dir, capture_output=True, text=True) if result1.returncode != 0: print(f"Preprocessing failed for {input_dir}: {result1.stderr}") # 执行模型脚本,统一路径为/home/user/xyz/... model_cmd = ["python", "/home/user/xyz/model/model_directory/Driver.py", "metadata.json"] result2 = subprocess.run(model_cmd, cwd=work_dir, capture_output=True, text=True) if result2.returncode != 0: print(f"Model run failed for {input_dir}: {result2.stderr}") print(f"end process:{input_dir}") if __name__ == '__main__': starttime = time.time() # 可指定进程数,比如Pool(processes=5),默认是CPU核心数 pool = Pool() pool.map(par, range(0, 5)) pool.close() pool.join() # 必须加join,等待所有子进程完成 endtime = time.time() print(f"Time taken {endtime-starttime} seconds")
关键改进点
- 修正双下划线错误:确保多进程池能正确创建子进程。
- 使用subprocess替代os.system:
subprocess.run支持指定cwd参数,直接让脚本在目标目录执行,无需调用os.chdir,同时能捕获命令的输出和错误码,方便排查问题。 - 添加目录存在检查:提前避免因目录不存在导致的错误。
- 添加pool.join():原代码没有
join(),主进程可能在子进程完成前就结束,导致输出不完整。 - 统一路径:修正第二个脚本的路径错误,确保能找到脚本文件。
额外说明
- 如果你的CPU核心数较多,可以通过
Pool(processes=5)指定进程数为5,确保每个目录对应一个进程。 capture_output=True会捕获命令的stdout和stderr,如果不需要可以去掉,改为直接输出到控制台。- 若Driver.py需要读取当前目录下的
metadata.json,cwd参数会确保脚本在指定目录下运行,能正确找到该文件。
内容的提问来源于stack exchange,提问作者v6k
相关产品推荐
相关产品推荐

