PyInstaller打包Windows二进制文件缺失gclib第三方Python模块问题
PyInstaller打包报错ModuleNotFoundError: No module named 'gclib'的解决办法
环境信息
- PyInstaller: 5.6.2
- Python: 3.9.2
- Windows 10 10.0.15063 SP0
问题重现
虚拟环境搭建完成、依赖安装完毕后,按PyInstaller文档步骤生成.spec文件,手动添加额外datas后重新打包成功,但双击生成的可执行文件时弹出以下错误:
Traceback (most recent call last): File "myProgram.py", line 8, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 499, in exec_module File "myProgram_Controller.py", line 41, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 499, in exec_module File "galil\galil_client.py", line 8, in <module> ModuleNotFoundError: No module named 'gclib'
已做尝试
- 推测
import gclib语句未被PyInstaller识别,创建hook-gclib.py文件:
from PyInstaller.hooks.hookutils import (collect_data_files, collect_submodules) datas = [('./galil/gclib.py', 'gclib')] hiddenimports = collect_submodules('gclib')
- 删除输出目录、备份原.spec文件,执行以下命令生成新.spec并重新添加datas后打包:
pyinstaller --additional-hooks-dir=. --windowed myProgram.py
但问题依旧,hook文件未出现报错信息。
解决方案
1. 修正hook文件逻辑
你编写的hook中datas配置属于冗余操作,且collect_submodules('gclib')在找不到子模块时会返回空列表。直接简化hook内容:
from PyInstaller.hooks.hookutils import collect_submodules # 若gclib是独立模块,用这行 hiddenimports = ['gclib'] # 若gclib是galil包下的子模块,替换成下面这行 # hiddenimports = ['galil.gclib']
保存后重新使用--additional-hooks-dir=.参数打包,或者将hook文件放到虚拟环境下的Lib/site-packages/PyInstaller/hooks目录(PyInstaller默认hooks路径)。
2. 直接修改.spec文件(最稳妥方案)
跳过hook文件,直接编辑你的.spec文件,在Analysis部分的hiddenimports列表中添加缺失的模块:
a = Analysis( ['myProgram.py'], pathex=[], binaries=[], datas=[# 你的额外datas配置], hiddenimports=['gclib'], # 此处添加gclib或galil.gclib hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )
修改完成后执行pyinstaller myProgram.spec重新打包。
3. 检查代码导入路径是否正确
- 如果
gclib.py位于galil文件夹内,代码中应使用from galil import gclib而非直接import gclib;若必须用import gclib,需在代码开头将galil目录添加到Python路径:
import sys, os sys.path.append(os.path.dirname(os.path.abspath(__file__)))
- 若
gclib是第三方库,先确认虚拟环境中已安装:执行pip list查看是否存在gclib相关包。
4. 强制指定模块路径
打包时通过--paths参数告知PyInstaller模块所在目录:
pyinstaller --paths ./galil --windowed myProgram.py
或者在.spec文件的pathex中添加该路径:
a = Analysis( ['myProgram.py'], pathex=['./galil'], # 添加gclib所在的目录 ... )
内容的提问来源于stack exchange,提问作者cogito
相关产品推荐
相关产品推荐

