Python 学习记录 使用pyinstaller 打包tensorflow 2.8.0 keras项目

这篇博客记录了使用PyInstaller打包Python程序时遇到的问题,包括程序运行崩溃和调用模型失败等。解决方案涉及到修改配置文件main.spec,添加特定dll文件,修改调用keras的方式,创建hook文件来收集tensorflow和keras模块。最终成功打包并测试运行正常。
部署运行你感兴趣的模型镜像

使用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的问题
输入内容
我项目用到了tensorflowkeras,所以收集这两个模块

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运行测试

测试后是正常加载模型的(我的代码在软件启动时会预加载模型测试,加载失败会抛出异常无法顺利进入主页面)
在这里插入图片描述

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### 使用 PyInstaller 打包包含 TensorFlowPython 应用程序 #### 设置编码格式 为了防止因字符集不同而产生的乱码问题,在执行打包操作之前,建议设置系统的活动代码页为 UTF-8 编码。可以通过命令 `chcp 65001` 来实现这一目的[^3]。 #### 创建虚拟环境并安装依赖项 确保在一个干净的环境中工作非常重要。推荐创建一个新的 Conda 或者 venv 虚拟环境来管理项目的依赖关系。特别注意的是,PyInstaller 需要在同一个环境中被安装,这样才能正确识别和处理 TensorFlow 及其相关库中的隐含导入模块[^5]。 #### 解决隐藏导入问题 当使用 PyInstaller 对含有 TensorFlow 的应用进行打包时,可能会遇到一些未检测到的内部模块引用问题。为了避免这种情况发生,可以在调用 PyInstaller 命令时通过 `--hidden-import` 参数显式指定这些必要的模块名称。对于 TensorFlow 来说,至少应该加入如下选项: ```bash pyinstaller -F your_script.py --hidden-import=tensorflow ``` 这一步骤有助于确保所有必需的 TensorFlow 组件都能被打入最终可执行文件中[^1]。 #### 处理特定版本兼容性问题 针对某些具体版本(如 TensorFlow 2.x),可能还需要额外调整以适应框架的变化。例如,有报告指出在尝试访问 `tensorflow.python` 下的内容时遇到了困难;这是因为自 TensorFLow 2.0 开始,部分 API 已经发生了迁移或重构。因此,应当依据官方文档更新代码逻辑,并确认所使用的接口仍然有效[^2]。 #### 示例脚本配置文件生成 假设有一个名为 `app.py` 的入口脚本,则完整的构建指令可能是这样的: ```bash pip install pyinstaller pyinstaller app.py -F --hidden-import tensorflow ``` 另外,也可以选择先生成 `.spec` 文件再做进一步定制化修改。这样做的好处是可以更精细地控制整个打包流程,比如添加数据资源、排除不必要的二进制文件等。为此只需简单运行一次不带 `-F` 参数的基础命令即可获得初始模板: ```bash pyinstaller app.py ``` 之后编辑生成的 spec 文件,最后再次利用它来进行单文件模式下的编译: ```bash pyinstaller app.spec ``` #### 测试调试 完成上述步骤后得到的应用应能够在脱离开发环境的情况下独立运行。不过考虑到实际场景复杂多变,初次生成的结果未必完美无缺。此时不妨借助命令行工具查看详细的启动日志信息以便定位潜在缺陷所在之处。通常情况下,直接双击 exe 文件难以获取足够的反馈用于诊断问题根源,所以最好是在终端内手动触发执行过程,观察是否有异常提示输出给定解决方案方向[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三千喵喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值