【发布时间】:2019-05-22 06:35:42
【问题描述】:
我有一个 Python 脚本在我正常运行时运行良好:
$ python script.py <options>
我正在尝试使用 cProfile 模块分析代码:
$ python -m cProfile -o script.prof script.py <options>
当我启动上述命令时,我收到一个关于无法腌制函数的错误:
Traceback (most recent call last):
File "scripts/process_grid.py", line 1500, in <module>
_compute_write_index(kwrgs)
File "scripts/process_grid.py", line 626, in _compute_write_index
args,
File "scripts/process_grid.py", line 1034, in _parallel_process
pool.map(_apply_along_axis_palmers, chunk_params)
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/pool.py", line 266, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/pool.py", line 644, in get
raise self._value
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
put(task)
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/connection.py", line 206, in send
self._send_bytes(_ForkingPickler.dumps(obj))
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function _apply_along_axis_palmers at 0x7fe05a540b70>: attribute lookup _apply_along_axis_palmers on __main__ failed
代码使用多处理,我假设这是酸洗发生的地方。
游戏中的代码是here on GitHub。
基本上我是在进程池中映射一个函数和一个对应的参数字典:
pool.map(_apply_along_axis_palmers, chunk_params)
据我所知,函数_apply_along_axis_palmers 是“可挑选的”,因为它是在模块的顶层定义的。同样,在 cProfile 上下文之外运行时不会发生此错误,所以这可能是为酸洗添加了额外的约束?
谁能评论为什么会发生这种情况,和/或我可以如何纠正这个问题?
【问题讨论】:
-
FWIW,我唯一遇到的酸洗问题是酸洗功能。
-
试试this。
-
谢谢,@Darkonaut,我不知道在写这个问题之前我是怎么没有发现自己的。我的问题是关于一个函数而不是一个类,这是该问题所要解决的问题,但也许一个想法是在一个单独的模块文件中创建函数,正如其中一个答案所暗示的那样作为解决方案?我会试一试...
-
我还没有对此进行测试,但也许您只需创建一个中间
profile.py就可以摆脱困境,它只是从您的真实目标脚本导入并调用您的main。
标签: python pickle python-multiprocessing cprofile