pyinstaller 打包python GUI程序避坑指南
一、pyinstaller打包踩坑描述
之前用PyQt写了一个python GUI程序,当时打包很顺利,命令也很简单,最近来更新维护这个程序,改好代码,然后打包也很顺利,但是打包完成后,运行exe程序就报错了,一直报错模块找不到,报错如下:
File “qtexe\main.py”, line 6, in
File “C:\Users\NUC\AppData\Local\Temp\embedded.31opupww.zip\shibokensupport_feature_.py”, line 142, in _import
ModuleNotFoundError: No module named ‘wallet_module’
二、导致报错原因分析
看报错的字面意思是没有找到我自定义的模块"wallet_module",但是我本地运行是正常的,所以问题应该出在打包的时候没有将我指定的py文件打进去
三、解决方案
1、指定打包文件所在的路径
2、指定需要添加的文件
3、指定需要添加的py文件
4、代码中全程使用相对路径动态获取路径
四、解决方案一
1、打包命令修改
pyinstaller -wF --paths "D:\work2023\GitDir\qt_project" --add-data "png/1.png;png" --add-data "png/2.png;png" --add-data "png/3.png;png" --add-data "keys/20240402_certificate.pem;keys" --add-data "keys/20240402_private_key.pem;keys" --add-data "keys/20240402_public_key.pem;keys" main.py --hidden-import chat_module --hidden-import data_aes_encrypt --hidden-import data_md5_sign --hidden-import data_rsa_encrypt --hidden-import data_tools --hidden-import food_module --hidden-import foodother --hidden-import handle_chat_mysql --hidden-import handle_faker --hidden-import handle_food_mysql --hidden-import handle_register_wallet --hidden-import handle_wallet_mysql --hidden-import public_module --hidden-import public_tools --hidden-import user_param --hidden-import wallet_module --hidden-import wallet_signature --hidden-import window
2、参数说明
–paths:指定项目绝对路径
–add-data:添加程序运行过程中需要的文件,多个文件要写多个–add-data,格式:“目录/文件名称;打包后放的目标目录名称”
–hidden-import:添加py模块,多个py文件要写多个–hidden-import
五、解决方案二
1、修改打包过程中生成的main.spec文件
a = Analysis(['main.py'],pathex=['D:\\work2023\\GitDir\\qt_project'],binaries=[],datas=[('png/1.png', 'png'), ('png/2.png', 'png'), ('png/3.png', 'png'), ('keys/20240402_certificate.pem', 'keys'), ('keys/20240402_private_key.pem', 'keys'), ('keys/20240402_public_key.pem', 'keys')],hiddenimports=['chat_module', 'data_aes_encrypt', 'data_md5_sign', 'data_rsa_encrypt', 'data_tools', 'food_module', 'foodother', 'handle_chat_mysql', 'handle_faker', 'handle_food_mysql', 'handle_register_wallet', 'handle_wallet_mysql', 'public_module', 'public_tools', 'user_param', 'wallet_module', 'wallet_signature', 'window'],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],noarchive=False,
)
pyz = PYZ(a.pure)exe = EXE(pyz,a.scripts,a.binaries,a.datas,[],name='main',debug=True,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=False,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)
2、基于修改后的main.spec进行打包,执行重新打包命令
pyinstaller main.spec