使用pyinstaller打包时候踩了一些坑,每次运行的时候一调用模型程序就崩了
这里记录一下解决过程
安装pyinstaller
pip install pyinstaller
生成pyinstaller打包的配置文件
首先先生成pyinstaller打包的配置文件
pyinstaller -w -i favicon.ico main.py --additional-hooks-dir=hooks
favicon.ico
是我程序的图标
main.py
是我运行的主程序
不需要图标就去掉-i favicon.ico
参数即可
运行时执行Ctrl + C
中止运行
因为我们要修改main.spec
文件
打开打包路径下的main.spec
文件进行修改
- 因为我用了cuda库64位 11.7版本,所以 设置datas中添加cudart64_110.dll
- 使用了keras也要引用进去
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=['tensorflow.python._pywrap_tensorflow_internal.pyd', 'cudart64_110.dll'],
hiddenimports=['keras.*'],
hookspath=['hooks'],
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,
[],
exclude_binaries=True,
name='智慧垃圾回收系统',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='favicon.ico',
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='智慧垃圾回收系统',
)
修改调用keras的py文件
接着修改调用keras的py文件
原先是使用tf.keras进行调用全部改为使用keras进行调用
#import tensorflow as tf
import keras
比如原先是
model = tf.keras.models.Sequential()
改为
model = keras.models.Sequential()
创建hook-tensorflow.py文件收集tensorflow
然后创建hook文件夹
在hook文件夹下创建hook-tensorflow.py
文件
这个文件用来解决pyinstaller 打包时候无法hook tensorflow的问题
输入内容
我项目用到了tensorflow
和keras
,所以收集这两个模块
from PyInstaller.utils.hooks import collect_all
def hook(hook_api):
packages = [
'tensorflow',
'keras'
]
for package in packages:
datas, binaries, hiddenimports = collect_all(package)
hook_api.add_datas(datas)
hook_api.add_binaries(binaries)
hook_api.add_imports(*hiddenimports)
运行pyinstaller打包
运行
pyinstaller main.spec
之后会将项目收集到dist文件夹下面
根据main.spec
的配置保存到了coll
参数里设置的智慧垃圾回收系统
文件夹中
进入这个文件夹,复制_pywrap_tensorflow_internal.pyd
到该目录下的tensorflow
文件夹中
自此打包结束
打开exe运行测试
测试后是正常加载模型的(我的代码在软件启动时会预加载模型测试,加载失败会抛出异常无法顺利进入主页面)