[python]使用pyinstaller打包基于tensorflow 2.0的程序

2023-05-16

打包过程中遇到了许多问题,本身tensorflow 2.0就挖了一个大坑,这里记录下遇到文件及解决方法,最后把用到的相关文件分享出来,供大家参考使用。

1 模块找不到的几种表现形式

一般是在运行打包的Exe时,会报错,通常缺少模块表现如下:
(1)ModuleNotFoundError: No module named ‘tensorflow.python.platform’
(2)ImportError: cannot import name ‘pywrap_tensorflow’ from ‘tensorflow_core.python’
(3)qt.qpa.plugin: Could not find the Qt platform plugin “windows” in “”

2 隐藏调用的模块

这是tensorflow 2.0带来的一个大坑!!
与tensorflow 1.X相比,tensorflow2.0的文件夹组织形式发生重构,具体对比如下:
1.X目录结构组织如下:
在这里插入图片描述
2.0开始,如下:
在这里插入图片描述
2.0为了跟之前兼容,使用了隐藏模块调用的方法。

具体来说,一般模块的名称是按照目录结构组织的,即:
‘tensorflow.python.platform’, 那么会在tensorflow下面有一个python文件夹,在python文件夹下有一个platfow。
而在2.0中这个python被放在了tensorflow.core中,而tensorflow文件夹下空空如也。

为了兼容之前1.X的模块调用方式,在2.0的tensorflow文件夹下有一个__init__.py文件,在其中进行了偷梁换柱。将所有以前tensorflow.XXX的模块名称,实际加载的模块变成了tensorflow_core.XXX,具体的可以去分析下这个文件。

那么问题就来了,在pyinstaller分析时,根本分析不到这一层,他是按照目录结构那种方式去找模块的,于是就出现了数十个无法找到的情况。

解决方法,在spec文件的hiddenimports中加入,一开始我也是这么加的,但发现这样根本不可能完成。因为有很多个,你需要一遍遍按照完了才知道缺啥,这是一个非常费力费时的事情。

为此,本人又使用了spec中的hook,将为tensorflow加了一个hook,具体的hook用法参见另一篇文章:https://blog.csdn.net/kevinshift/article/details/104880101
这个hook文件在其中给大家分享了。

另外,我把hook-tensorflow.core.framework.py也给使用了hook。

但是,由于时间仓促,加上边研究边做,在hook中我是把tensorflow中许多模块都引入了,虽然这样能运行成功,但是由于可能打包了多余的模块,会使得打包程序比较大。这个以后有机会了再细究吧。

另外,本人的两个hook文件,及spec文件中有很多冗余重复的。大家可以自己挑挑。

3 tensorflow的二进制文件

tensorflow中的多个二进制文件也没有被包含就去,我手动使用了binaries:

binaries=[(r'C:\ProgramData\Anaconda3\envs\tensorflow4\Lib\site-packages\tensorflow_core\lite\experimental\microfrontend\python\ops\_audio_microfrontend_op.so',r'.\tensorflow_core\lite\experimental\microfrontend\python\ops')
             ]

4 调用栈超过最大限制

中间报过错误:RecursionError: maximum recursion depth exceeded
解决方法为在spec文件头中加入以下代码:

#下面这个设置了查找的栈深度,作者遇到了报RecursionError: maximum recursion depth exceeded情况,靠这个解决的。默认1000深度。见https://blog.csdn.net/ljt350740378/article/details/96134208
import sys
sys.setrecursionlimit(1000000) #例如这里设置为一百万

以上参考:https://blog.csdn.net/ljt350740378/article/details/96134208

5 UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 问题

解决方法:
在运行pyinstaller -F xxx.py或pyinstaller yyy.spec前,先运行
chcp 65001 。
然后再运行pyinstaller -F xxx.py或pyinstaller yyy.spec。
如下图所示就可以了:
在这里插入图片描述
感谢这里的分享:https://blog.csdn.net/qq_38343111/article/details/91362920

6 打包完后,发现缺少一个python文件问题

自己写了2个python文件A、B,其中A引用另一个B(B为库文件用),在打包A时,自动的去发现A中有import B.pytho,于是就可以自动的把B也打包进去。
但是,没注意,忘了把B和A放在同一个文件夹下,于是在打包生成Exe,运行A时,报缺少B文件库。于是赶紧把B文件拷贝到A同文件夹下,之后继续使用打包。最后发现还是刚才的问题。。。

这个问题是由于打包程序使用了缓存的问题,方法是清除和Spec文件中指定的build文件夹下的同一个工程的文件夹。默认和spec文件夹在同一个文件夹下有一个build,其中有一个和python文件名相同的文件夹,是用来存打包过程中的文件缓存的。删除后将使他重新生成!

7 tensorflow打包汇总

本人打包时使用了一个spec文件,两个hook文件。具体的样子在另一篇文章中都分享出来了,具体见:https://blog.csdn.net/kevinshift/article/details/104880101

后注 202201

最近安装了新版本的tensorflow 2.7,没有了本文中所述的问题了。他的目录结构又改回跟1.X版本类似的了。不知道是不是官方因为这个问题又改回去了。但具体从那个版本开始改的,没有细查。大家在使用的时候可以留意一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[python]使用pyinstaller打包基于tensorflow 2.0的程序 的相关文章

随机推荐

  • [WPF]UIElement被按下不同时间时实现不同的响应

    问题起源 起源于想在用户单击一个button时实现如下效果 xff1a xff08 1 xff09 当用户单击时 xff0c 发出一个指令A xff08 2 xff09 如果用户将button按下 xff0c 保持一段时间 xff08 如2
  • C#程序启动和关闭外部程序

    参考 xff1a 1 C 启动外部程序的几种常用方法汇总 2 C 调用exe程序总结 3 MSDN文档 xff1a Process 类 4 C 进程Process基本的操作说明 5 C 操作进程 Process 1 方法 主要使用Proce
  • C#向自己调用的c++Dll传递回调函数及其调用

    参考 xff1a 1 c 调用c 43 43 带有回调函数方法的实现 1 目的及方法 C 程序调用了一个C 43 43 的dll xff0c 向给dll传递一个回调函数 xff0c 供dll在一定时机回调C 中的程序执行 方法见参考 1 2
  • SSO单点登录前后端分离完整版·(开源)

    前言 xff1a 3月建的仓 xff0c 完成确是在7月中旬 xff0c 实际完成时间加起来不到10天 xff0c 中间停滞了很久 xff0c 主要工作太忙 xff0c 白天没时间搞 xff0c 况且工作摸鱼也不是我的作风 xff0c 晚上
  • 四种常见软件开源协议介绍-GPL、LGPL、BSD、Apache

    转自 xff1a https baijiahao baidu com s id 61 1603028095502634219 amp wfr 61 spider amp for 61 pc 软件开源是许多软件企业需要关注的问题 xff0c
  • opencv及其在c#中调用

    1 opencv简介 OpenCV Open Source Computer Vision Library 是一个 开源免费 发行的跨平台计算机视觉库 xff0c 可以运行在Linux Windows Android ios等操作系统上 x
  • [python]conda升级中的几个问题

    1 PermissionError Access is denied 在进行升级conda操作时 xff0c 提示上面的错误 升级操作为 xff1a conda update conda 就是权限的问题 xff0c 解决方法 xff1a 使
  • 【python】语言及第三方库帮助文档

    目录 1 python2 NumPy3 Spicy4 Matplotlib5 Tensorflow6 WSGI7 Flask框架8 Spyder 1 python 分python2和python3 xff0c 两者差异较大 python3的
  • [python]Python中使用WSGI和Flask进行web通信

    通信方法和示例 主要利用WSGI进行 xff0c 此外 xff0c 在WSGI之上 xff0c 还可以结合Flask框架完成 关于二者的介绍 教程和示例等参见 xff1a https blog csdn net kevinshift art
  • [python]语法要点与技巧

    文章目录 1 With As语句2 字符串操作2 1 查找2 2 替换2 3 切片2 4 各种操作 3 数据类型及其定义3 1 标准数据类型3 2 三种符号的应用3 3 列表 字典 集合定义3 4 变量 对象 类与类型3 5 字符串格式化
  • 【opencv】文档及使用

    帮助文档 1 xff0c Opencv 3 0官方帮助文档 https docs opencv org 3 0 beta 2 OpenCV各版本官方文档 https docs opencv org 4 1 0 https docs open
  • python下的opencv

    1 识别轮廓 findcontours https blog csdn net m0 37706703 article details 81081352 轮廓及其各种特性 https blog csdn net kwame211 artic
  • TensorFlow库及API

    1 很好的一个介绍 https blog csdn net g6u8w7p06dco99fq3 article details 94241399 2 tf slice https www jianshu com p 71e6ef6c121b
  • C#调用python程序

    四种方法 xff1a https blog csdn net qq 42063091 article details 82418630 其中 制作Exe xff0c 使用pyinstaller xff0c 具体参见文章 xff1a http
  • 基于leaflet编写的经纬线网格绘制react插件

    一 先看效果 经纬线网格插件测试 业务场景就是通过开关来控制经纬线格网图层在地图上的显示与关闭 xff0c 且开启时 xff0c 随着地图的移动 xff08 视窗发生了改变 xff09 xff0c 网格图层也要相应的实时清除和重绘 这个功能
  • opencv各种版本下载地址

    参考 xff1a https blog csdn net omodao1 article details 80276834
  • [python,opencv]如何判断一副图片的通道数

    参考 xff1a https stackoverflow com questions 19062875 how to get the number of channels from an image in opencv 2 opencv中对
  • 【C#,WPF】WPF中的Ribbon菜单和Dock框架

    WPF没有类似其他窗体的多文档 xff0c 需要自己做不少东西 xff0c 这里有些管理的控件 1 自己写一个动态添加类似窗体的程序 参考 xff1a https blog csdn net soft2buy article details
  • 【python】python开发工具链

    1 集成开发环境 Spyder 2 IDE的代码提示插件 Kite 见介绍https pypi tuna tsinghua edu cn simple 官方网站 xff1a https kite com integrations spyde
  • [python]使用pyinstaller打包基于tensorflow 2.0的程序

    打包过程中遇到了许多问题 xff0c 本身tensorflow 2 0就挖了一个大坑 xff0c 这里记录下遇到文件及解决方法 xff0c 最后把用到的相关文件分享出来 xff0c 供大家参考使用 1 模块找不到的几种表现形式 一般是在运行