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
相关产品推荐
相关产品推荐

