如何修复Python多进程中的AttributeError错误?
Python多进程AttributeError错误原因及修复方法
错误原因
- Windows系统下Python多进程采用spawn模式创建子进程,子进程会重新导入主模块。Spyder运行脚本时,主模块为
__main__,但子进程导入时找不到do_something函数——要么是函数定义被放在了if __name__ == '__main__':代码块内部(子进程不会执行该代码块),要么是Spyder的默认运行环境导致主模块的命名空间未被正确传递给子进程。 - 你能看到最终耗时打印,是因为主进程未受影响,但子进程启动时找不到目标函数,抛出错误。
修复方法
方法1:调整代码结构
把do_something函数定义放在if __name__ == '__main__':代码块之外,确保子进程导入主模块时能找到该函数。示例代码:
import time from multiprocessing import Process # 函数定义放在主判断代码块之外 def do_something(seconds): print(f'Sleeping {seconds} second(s)...') time.sleep(seconds) print('Done sleeping') if __name__ == '__main__': start = time.perf_counter() # 创建并启动子进程 p1 = Process(target=do_something, args=(1,)) p2 = Process(target=do_something, args=(1,)) p1.start() p2.start() # 等待子进程完成 p1.join() p2.join() finish = time.perf_counter() print(f'Finished in {round(finish-start, 2)} second(s)')
方法2:修改Spyder运行设置
Spyder默认的图形后端可能导致主模块命名空间无法被子进程正确识别,可通过以下步骤调整:
- 打开Spyder,依次点击 Tools > Preferences > IPython console > Graphics
- 在Graphics backend区域,将后端选项从Inline改为Automatic或Qt5
- 重启IPython控制台后重新运行脚本,也可直接在控制台输入
%matplotlib auto临时切换后端。
内容的提问来源于stack exchange,提问作者Mahmoud Abdel-Rahman
相关产品推荐
相关产品推荐

