用pyinstaller将python写的深度学习模型(基于tensorflow)转换为独立于python的可执行文件(exe)
因为一些原因,我需要将训练好的深度学习预测模型迁移到其他电脑,为了解决迁移环境安装的问题,我开始搜寻python环境打包的,主要有两个方法,一个是docker,一个是exe可执行文件,这里介绍可执行文件方法
1、可用方法
下面是python自带的一些将代码转化为可执行文件的方法,根据我的环境,python3.6,windows,因此我选择了pyinstaller方法
2、pyinstaller安装
直接在对应环境下利用pip即可
pip install pyinstaller
建议利用国内源下载,我已经事先配置好豆瓣源
也可离线安装,与其他包安装无异
3、打包过程
文件介绍,主程序文件main.py,权重文件model.h5,依赖包y.py,
在cmd窗口操作
先转到对应的虚拟环境,建议对打包的文件创建一个新的虚拟环境,可以大大减小exe文件的大小
conda activate py36
转到文件所在目录
cd 目录
打包
pyinstall main.py -p y.py
这样在当前目录下会生成一的dist文件夹,文件夹下还有一个main文件夹,exe文件就在main文件夹下,需要整个main文件夹程序才能正常运行,权重文件需要拷贝到当前文件夹下即可运行
单文件模式
pyinstall -F main.py -p y.py
这样dist文件夹下仅有一个exe文件,将权重文件与exe文件放在同一目录下即可运行
4、排坑过程
我碰到了几个坑,这边总结一下解决问题的方法
1、ImportError: cannot import name ‘pywrap_tensorflow’,ModuleNotFoundError: No module named 'tensorflow_core.python
在main.py文件下增加hooks文件夹,hooks下新建hook-tensorflow.py文件
文件目录
--mypython.py
--hooks
--hook-tensorflow.py
hook-tensorflow.py文件
from PyInstaller.utils.hooks import collect_all
def hook(hook_api):
packages = [
'tensorflow',
'tensorflow_core',
'astor'
]
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)
类似的错误可在packages中增加环境,亲测matplotlib有效
2、gpu环境运行错误ModuleNotFoundError: No module named ‘tensorflow.python._pywrap_tensorflow_internal’
当tensorflow-gpu版本高于1.6会出现此情况
文件夹生成模式解决方案
在生成的dist/[main]/文件夹中,
找到“_pywrap_tensorflow_internal.pyd”文件,剪切,
在这个文件夹中新建一个tensorflow文件夹,
在tensorflow文件夹中新建一个python文件夹,
将刚刚剪切的pyd文件黏贴到python文件夹中,再次运行exe
单文本模式解决方案
首先在python库文件夹中找到_pywrap_tensorflow_internal.pyd
(懒得找就用文件夹模式生成一次,在exe所在的文件夹中就有),
然后使用以下命令生成。
pyinstaller -F aaa.py --add-data="/path/to/the/pyd/_pywrap_tensorflow_internal.pyd;tensorflow/python"
3、直接点击exe运行闪退
这个暂时还没有很好的解决方案,我的方法是cmd窗口运行,即可看到结果和报错
参考
https://blog.csdn.net/graceful_snow/article/details/103227660
https://blog.csdn.net/graceful_snow/article/details/103227660
https://blog.csdn.net/graceful_snow/article/details/103227660