稍微记录一下最近在liunx上pyinstaller打包出错

目录

  • 稍微记录一下最近在liunx上pyinstaller打包出错
    • 1 号坑 Python3.7.0安装
    • 2号坑 成功打包但是执行失败
    • 3 号坑 paddleocr 打包
  • 小结

后面代码的环境是在Windows子系统下的Ubuntu 20.04下进行的。vscode可以通过,配置WSL来进入环境(如下图)。

最近有一个需求是要把一个系统部署到某公司服务器上去。要部署的两台服务器分别是Centos、Ubuntu的,里面就是有一些模型使用python写的嘛。模型的调用是通过java的后端项目触发的,这个模型的python环境不好搞,所以要打包成liunx下的可执行文件。本来想着用wine直接也可以触发exe的但是实际上发现还是挺麻烦的,不是很适配总是出现…not found。

我拿到的模型,用的tensorflow的版本是1点几的是比较老的。先来看一下大致用到的哪些包和对应的版本,(注意其中的numpy的版本也不能太高)

为了适应这个tensorflow的版本,需要的python版本不能大于3.8,我自己测试的话3.8的是不行的,3.7和3.6是ok的。然后这个需要对应的pyinstaller的版本是3.4的,版本不对应也会出错。

1 号坑 Python3.7.0安装

安装步骤直接参照这篇 https://blog.csdn.net/zckui/article/details/89821101 步骤还是挺详细的,不过坑也在其中。(这里要注意的是,里面说的创建软连接的时候不要直接修改liunx自带的最好自己创建一个)

关键在那篇博客中的第五步

这里只指定了python编译安装的路径,没有指定别的。本以为是没是的,然后每次执行pyisntaller ...打包的时候到下图所示时

的时候就报错

报错的意思差不多是说,自己下的python没有直接跟系统上自带的一些os链接在一起(跟自带的这些so文件版本不匹配)。

这个时候可以依次参考下面两篇博客:

  • 博客1

    这篇的话是针对我们编译时指定的参数的,跟前面的报错信息提示一样,博客中加的参数如下图

个人建议是

./configure --prefix= $pythonDownloadLocation --enable-shared --enable-ssl   ## 记得要一次性输完,刚开始以为这个直接改里面配置信息的,分#两次输入就不能解决问题

然后再make && make install

  • 博客2

    经过上一步之后,我们就可以在python安装的路径里面找到缺少的那几个文件,然后根据博客2都添加到系统的lib里面去

2号坑 成功打包但是执行失败

跨过一号坑后,我们可以成功打包的流程:

Building EXE from EXE-00.toc completed successfully.

看到这个是非常激动的,但是当执行的时候又出了点问题。

astor 报错

错误信息

FileNotFoundError: [Errno 2] No such file or directory: '/tmp/_MEIu22u7n/astor/VERSION'

看了网上别人的一些解决方案和分析。这个其实是astor包里面的问题。

可以按照我下图的标注解决

新增的这个__version__等于多少应该问题不大,保险的话,可以在修改前通过pip list看看这个astor是什么版本的。

编辑之后保存修改,并且重新执行pyisntaller的打包命令。

tensorflow 包中报错

然后出现了tensorflow包里面的报错:

tensorflow.python.framework.errors_impl.NotFoundError: /tmp/_MEIOH1ebc/tensorflow/contrib/bigtable/python/ops/_bigtable.so: cannot open shared object file: No such file or directory

这个其实是,跟前面报错的原因是类似的。应该是包里面引用某个文件的时候用错了路径,pyinstaller在打包的时候会有一个虚拟路径,一般有/tmp ....里面的东西找不到的都是这个问题。然后可以跟着下面这篇文章解决这个问题 文章。

主要参考的回答:

翻译一下文章中的解决方案,一是要找到所有类似的.so文件,可以通过以下代码进行查看:

import ostsLocation = "/usr/local/python3.7/lib/python3.7/site-packages/tensorflow"tensorflow_binaries = []for dir_name, sub_dir_list, fileList in os.walk(tsLocation): for file in fileList:if file.endswith(".so"):full_file = dir_name + '/' + fileprint(full_file)tensorflow_binaries.append((full_file, '.'))print(*tensorflow_binaries)

输出大致如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MScUFoN0-1666597606845)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/image-20221024152038101.png)]

可以把这些文件路径添加到对应的.spec文件中

添加路径的注意和技巧:

  • 注意添加的格式 ("$path", ".")
  • 注意前面的 /usr/local/python3.7这段路径要换成自己python所在的路径
  • 技巧 可以同vscode上快捷编辑的方式,把前面代码中的输出复制进去然后按住鼠标滚动轮子,选中多行同时进行编辑。

下面我们去修改 tensorflow包中导入这些文件的代码

根据上图的标注,然后修改保存。

然后执行pyinstaller ××××.spec去打包文件。

到这里这个问题应该就解决了,

继续尝试运行打包后的可执行文件,结果出现了:

ModuleNotFoundError: No module named 'sklearn.utils._typedefs'

这个与前面的错误原因不太一样,下面给出一种简单的解决方法。在.spec文件中的hiddenimports中添加缺少的module.

添加后直接执行pyinstaller ./×××.spec重新执行打包。

3 号坑 paddleocr 打包

这次的报错就比较迷惑:

struct.error: 'I' format requires 0 <= number <= 4294967295


乍一看这个应该是什么越界了,然后就开始找解决方案。
然后就找到对这个问题分析的社区,https://github.com/pyinstaller/pyinstaller/issues/3939
意思是说,自己打包成的exe大小超过限制。在那上面我没有找到对应的解决方案,不过我猜测这个大小限制是对应打包成的exe(可执行文件)的大小限制。于是我尝试减少打包成的可执行文件的体积,终于找到了问题。pyinstaller打包的时候可以指定以下几个常用命令:

  • -F :仅仅生成一个文件,不暴露其他信息,启动较慢 (也就是说最后只有一个可执行文件)
  • -D: 生成一个文件夹,里面是多文本模式,启动快
  • -w: 窗口模式打包,不显示控制台
  • -c: 跟图标路径,作为icon
  • –hidden-import: 应用需要的包,但是没有被打包进来,这里错误最多,因为一般是第三方包隐式调用其他包,然后打包出来的显示无法找到模块。

因为之前我习惯使用pyinstaller -F -c ×××.py这个命令去打包,刚刚好paddleocr依赖的其它包有很多导致体积过大。
于是我使用打包命令pyinstaller -D -c ×××.py,终于显示打包成功。包是打包成功了,但是使用的时候还有很多缺少模块的报错,比如下图

这个时候我们需要做的是从对应的路径里面包这个pywt拷贝到dist里面与可执行文件的同级目录中。注意:注意修改拷贝过去的文件的使用权限

小结

之前就打包过多次python,除了系统缺少dll文件外的大部分报错都在这次任务中碰到了。现在想来想学学虚拟环境技术还是很必要的,后面还得学一下docker这样在后面部署的过程中也不必大费周折了。

pyinstaller打包出错记录相关推荐

  1. PyQt5初学试验记录(三):Pyinstaller打包小结

    前言:本记录为笔者自学过程中的简单笔记,说明了从安装库到最终打包成.exe的过程,分为三个部分,供初学者参考交流,存在表述有误的部分还请读者们多多指教,下方为第三部分目录. 文章目录 一.Pyinst ...

  2. 计算机丢失cxplus.dll,pyinstaller打包cx_Oracle库问题处理记录

    pyinstaller打包cx_Oracle库问题处理记录 这两天打包程序,遇到坑无数,记录一下. 综合网上各类参考信息摘录,地址如下:https://www.cnblogs.com/BigFishF ...

  3. python打包一直出错_PyInstaller打包出错问题解决实践记录

    代码小工蚁英语单词列表生成器V2.0开发过程中问题备忘 笔者近期在使用Pyinstaller制作.EXE程序时遇到问题,出现如下提示: PyInstaller cannot check for ass ...

  4. Pyinstaller打包exe(包括打包资源文件 绝不出错版)

    Pyinstaller打包exe(包括打包资源文件 绝不出错版) 依赖包及其对应的版本号 PyQt5 5.10.1 PyQt5-Qt5 5.15.2 PyQt5-sip 12.9.0 pyinstal ...

  5. 记录pyinstaller打包过程中遇到的坑

    打包的过程主要参考PyInstaller打包详解 多线程bug build过程不报错,运行exe之后弹出空的命令行窗口,调出任务管理器发现main.exe在不停的启动进程. 查阅pyinstaller ...

  6. 解决PyInstaller打包程序exe在win7运行异常问题(OSError: [WinError 87] 参数错误、Error loading Python DLL python39.dll等)

    问题背景 平时一直在win10+anaconda环境下编写python程序,用pyinstaller打包后也没有问题.但是打包后发给其他同事,在win7机器上就出问题了. 经过一系列排查,终于解决了打 ...

  7. (1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能

    笔者总结不容易点个关注吧    一键三联哦!       感谢您! python pyinstaller打包exe添加版本信息 打包并添加版本信息 注意!这里有个坑 如果第二次要修改版权信息 要将fi ...

  8. 详解 pyinstaller 打包多个py文件

    前言 最近有个需求要把python项目打包成可执行程序运行,看了很多帖子,大多数博主都采用pyinstall 打包,看着也不难,本以为很简单的事情,对于我这个新手来说也折腾了2个多小时吧,记录下遇到的 ...

  9. AI:基于计算机视觉和语音识别案例项目打包过程记录20181226-19

    AI:基于计算机视觉和语音识别案例项目打包过程记录20181226-19 基于计算机视觉和语音识别案例项目打包过程 521 INFO: PyInstaller: 3.3.1 521 INFO: Pyt ...

最新文章

  1. windows 导出 oracle,windows 环境下oracle导入导出
  2. Java 字符串比较,String 中的一些方法 == 和 equals 的详解
  3. QCostomPlot 示例注解 2
  4. Linux kernel crash定位
  5. 什么时候用DFS,什么时候用BFS?(DFS和BFS的特点和异同)
  6. Android 反编译代码,资源修改,重新签名
  7. 计算机系统的基本组成
  8. 标签打印软件如何制作箭头样式
  9. python 极坐标图_Python中的极坐标图问题,未考虑角度
  10. java.lang.NoClassDefFoundError异常原因分析和解决方案
  11. 厘米换算英寸英尺(PTA题解)
  12. BZOJ 1059 [ZJOI2007]矩阵游戏
  13. 固态硬盘linux 性能,一种提高linux系统固态硬盘性能的方法与流程
  14. wannier拟合能带总是拟合不上_VASP+Wannier90方法拟合单层MoS2的能带,请问如何改善拟合结果?...
  15. python 队列实现_python中实现队列的queue模块
  16. 电影推荐系统 python简书_【记录|Spark】简单的电影推荐系统
  17. js面向对象编程基础
  18. 【资源共享】好用的视觉软件Adaptive Vision Studio
  19. Spring的事务详解
  20. 【算法设计与分析】-- 贪心法

热门文章

  1. 轻量级实时语义分割:ENet ERFNet
  2. Mysql全套看这一篇就够了特别详细
  3. 【笔记】机器视觉——工业相机
  4. Packet Tracer--配置帧中继
  5. 2014年年终总结——获得集团优秀员工称号的心得体会
  6. JAVA精品课程网站设计与实现
  7. 十字路头的拼音及解释
  8. 最长回文子串(C/C++动态规划)
  9. unp第一章的测试代码
  10. ThinkPad T400驱动安装