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

使用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的调用方式:

  1. 让corre_arrys接收单个文件路径作为参数,而非整个列表
  2. 去掉函数内部的循环,把遍历列表的工作交给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:43:12