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

Python多进程Pool运行脚本时如何将各进程输出分别写入独立文件

问题解决方案

以下是修复后的完整可运行代码,同时解决输出混叠和进程执行不完全的问题:

import os
import subprocess
from multiprocessing import Pool

script_list = ('myfirstfile.py',
               'mysecondfile.py',
               'mythirdfile.py',
               'myfourthfile.py')

def run_script(script_name):
    # 生成和脚本对应的独立输出文件名
    output_file = f"{os.path.splitext(script_name)[0]}_output.log"
    # 打开输出文件,将子进程的所有输出写入该文件
    with open(output_file, 'w', encoding='utf-8') as f:
        # 用subprocess替代os.system,更稳定且可指定输出位置
        subprocess.run(
            ['python', script_name],
            stdout=f,
            stderr=subprocess.STDOUT, # 错误输出也合并到同一份日志,可拆分单独存储
            check=False
        )
    return f"{script_name} 执行完成,日志已写入 {output_file}"

if __name__ == '__main__':
    # 初始化4进程池
    pool = Pool(processes=4)
    # 批量执行脚本
    results = pool.map(run_script, script_list)
    # 等待所有进程执行完毕
    pool.close()
    pool.join()
    # 可选:打印执行状态
    for res in results:
        print(res)

问题修复说明

1. 解决输出混叠问题

  • 每个脚本的输出会单独写入和脚本名对应的日志文件,完全避免多进程输出冲突
  • 若需要单独存储错误日志,可以拆分输出配置:
    err_file = f"{os.path.splitext(script_name)[0]}_error.log"
    with open(output_file, 'w', encoding='utf-8') as out_f, open(err_file, 'w', encoding='utf-8') as err_f:
        subprocess.run(['python', script_name], stdout=out_f, stderr=err_f, check=False)
    

2. 解决进程执行不完全问题

  • 新增if __name__ == '__main__'判断:这是Windows系统下Python多进程运行的强制要求,不加会导致子进程重复导入主模块,出现进程提前退出、启动不全的问题
  • 新增pool.close()+pool.join()逻辑:保证主进程会等待所有子进程全部执行完毕后再退出,不会提前杀死未完成的子进程
  • subprocess.run相比os.system更稳定,会正确等待子进程执行结束再返回,不会出现提前终止的情况

内容的提问来源于stack exchange,提问作者Syed Ali Mohsin Bukhari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:27:01