如何解决使用pandarallel时出现的“Can't pickle local object”错误
解决pandarallel中parallel_apply触发的Pickle序列化错误
刚碰到这个AttributeError: Can't pickle local object 'prepare_worker..closure..wrapper'错误的时候我也头大过,本质是pandarallel用多进程执行任务时,Python需要把函数序列化(pickle)后传给子进程,但本地对象(比如脚本里定义的函数)有时候没法被标准pickle正确处理。
针对你的代码,我整理了几个靠谱的解决办法:
1. 切换到fork模式初始化pandarallel
在Linux/macOS这类类Unix系统下,fork模式会直接复制父进程的内存空间,不需要严格pickle函数,能绕过大部分序列化问题。修改初始化代码就行:
pandarallel.initialize(nb_workers=4, use_fork=True)
这个方法最简单,对大多数场景都有效。
2. 确保函数在模块顶层定义
虽然你的func已经是顶层定义,但如果是在Jupyter Notebook这类交互式环境里运行,有时候函数会被识别为本地对象。这时候可以把函数单独放到一个.py文件里作为模块导入:
比如新建my_functions.py:
def func(x): return x
然后在主脚本/Notebook里导入:
from my_functions import func
模块级别的函数序列化起来毫无压力。
3. 改用cloudpickle作为序列化后端
标准pickle支持的类型有限,cloudpickle能处理更多复杂对象,包括本地函数。先安装cloudpickle:
pip install cloudpickle
然后初始化pandarallel时指定用它:
pandarallel.initialize(nb_workers=4, pickle_lib="cloudpickle")
这个方法兼容性最好,Windows系统也能用上。
你可以先试试第一个方案,修改后运行你的代码应该就能正常执行了。
内容的提问来源于stack exchange,提问作者Jannus
相关产品推荐
相关产品推荐

