使用multiprocessing调用函数时触发IsADirectoryError错误求助
问题分析与解决方案
我一眼就看出问题出在**multiprocessing.Pool.map的工作逻辑**和你的函数corre_arrys的参数匹配上了!
问题根源
pool.map(func, iterable)的作用是把iterable里的每个元素单独传给func,也就是说你的corre_arrys函数每次被进程调用时,拿到的不是整个listdF列表,而是列表里的单个CSV文件路径(比如'/path/scripts/pc_2_lc_1_T.csv')。但你的函数里却写了for files in listdF:,这时候listdF是单个字符串,循环会遍历字符串的每个字符——第一个字符就是'/',然后你用pd.read_csv('/')去读取根目录,自然就触发了IsADirectoryError!
修正步骤
只需要调整函数的参数逻辑,让它适配多进程map的调用方式:
- 让
corre_arrys接收单个文件路径作为参数,而非整个列表 - 去掉函数内部的循环,把遍历列表的工作交给
pool.map自动完成
修正后的完整代码
import os import pandas as pd from multiprocessing import Pool # 生成文件列表(这部分逻辑没问题) listdF = [os.path.join(os.sep, path, x) for x in os.listdir(path) if x.endswith('.csv')] # 修正后的处理函数:接收单个文件路径,返回处理后的DataFrame def corre_arrys(file_path): df = pd.read_csv(file_path, sep='\t', header=0, engine='python') # 在这里执行你的数据处理逻辑,比如: # df['new_col'] = df['old_col'].apply(...) return df # 多进程调用逻辑 NUM_PROCS = 8 pool = Pool(processes=NUM_PROCS) allDfs = pool.map(corre_arrys, listdF) # 记得关闭进程池并等待所有进程完成 pool.close() pool.join() # allDfs现在就是所有处理后的DataFrame组成的列表
补充说明
单进程运行时你应该是直接把整个列表传给函数,所以循环能正常遍历文件路径;但多进程下map的分发逻辑完全不同,这就是为什么单进程没问题、多进程报错的核心原因。另外一定要加上pool.close()和pool.join(),确保所有进程完成后再继续后续代码执行。
内容的提问来源于stack exchange,提问作者ARJ
相关产品推荐
相关产品推荐

