You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何在不同目录并行运行同一组Python脚本?

问题分析与解决方法

原代码的核心问题

  1. 语法错误:_name_和_main_必须是双下划线的__name__和__main__,这个错误会导致多进程池无法正确初始化,最终仅主进程执行第一个任务就终止。
  2. 路径不一致:第二个os.system调用里的路径是/home/vishnuk/xyz/...,和第一个路径的/home/user/xyz/...不统一,会导致找不到脚本。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:50:30