PyInstaller打包运行提示No module named 'arcade'错误如何解决
问题描述
脚本本身可正常运行,但使用PyInstaller编译后运行抛出如下错误:
Traceback (most recent call last): File "poples.py", line 3, in <module> ModuleNotFoundError: No module named 'arcade' [5316] Failed to execute script 'poples' due to unhandled exception!
当前环境已安装2.6.15最新版本的Arcade库,同时存在于两个路径:
- 系统Python路径:
C:\Users\Sarp\AppData\Local\Programs\Python\Python310\Lib\site-packages - 项目虚拟环境目录
已尝试以下操作均未解决问题:
- 删除venv文件夹后重新创建虚拟环境做全新重置
- 通过PyCharm的requirement.txt重新安装所有依赖包
- 在项目文件夹内执行
pyi-makespec命令生成spec文件,执行命令如下:
pyi-makespec --onefile --windowed --icon=icon.ico poples.py
- 编辑spec文件:将
hiddenimports=[]修改为hiddenimports=['arcade'],将console=False修改为console=True方便查看运行时错误,修改后的spec文件内容如下:
block_cipher = None a = Analysis( ['poples.py'], pathex=[], binaries=[], datas=[], hiddenimports=['arcade'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='poples', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon='icon.ico', )
- 在项目文件夹内执行
pyinstaller poples.spec命令完成打包 - 通过命令提示符运行打包生成的程序
- 仍然抛出找不到arcade模块的错误
解决方法
按以下步骤逐一操作即可解决该报错:
- 确认打包使用的PyInstaller属于当前项目虚拟环境
系统中存在多Python环境时,全局安装的PyInstaller打包时只会读取系统Python的依赖包,无法识别虚拟环境内安装的库。先激活项目venv,在激活的命令行窗口执行pip show pyinstaller,确认输出的安装路径在项目venv的site-packages目录下。如果路径指向全局Python,先执行pip uninstall pyinstaller卸载全局版本,再在激活的虚拟环境中执行pip install pyinstaller安装对应环境的版本。 - 补全arcade及其依赖的全量隐式导入
arcade库存在大量动态加载的子模块和依赖,仅在hiddenimports中填写arcade无法覆盖所有需要的模块,将spec文件中Analysis段的hiddenimports替换为以下内容:
hiddenimports=[ 'arcade', 'arcade.academy', 'arcade.application', 'arcade.color', 'arcade.csscolor', 'arcade.key', 'arcade.mouse', 'arcade.sprite', 'arcade.text', 'arcade.sound', 'arcade.physics_engines', 'arcade.gui', 'arcade.experimental', 'pyglet', 'pyglet.app', 'pyglet.window', 'pyglet.media', 'pyglet.gl', 'pyglet.graphics', 'pyglet.image', 'pyglet.text', 'pyglet.event', 'PIL', 'PIL.Image', 'numpy', 'pymunk' ],
- 加入arcade的静态资源文件
arcade运行需要加载内置的资源文件,打包时没有把这些资源打进去也会触发模块/资源加载错误。找到虚拟环境site-packages下的arcade目录,将Analysis段的datas字段修改为对应路径,示例:
datas=[('./venv/Lib/site-packages/arcade/resources', 'arcade/resources')],
- 清理旧缓存后重新打包
删除项目目录下的build、dist文件夹和旧的.spec文件,重新生成spec、执行打包命令。测试阶段可以先去掉--onefile参数,打包成文件夹模式验证运行正常后,再切换回单文件模式。
内容的提问来源于stack exchange,提问作者Ozzy
相关产品推荐
相关产品推荐

