pyinstaller打包出错记录

news2024/11/19 8:42:06

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

目录

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

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

在这里插入图片描述

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

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

image-20221024141520006

为了适应这个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自带的最好自己创建一个)

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

image-20221024142527124

这里只指定了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'

image-20221024144948056

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

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

image-20221024145314439

新增的这个__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 os

tsLocation = "/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 + '/' + file
      print(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文件中

image-20221024152154712

添加路径的注意和技巧:

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

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

image-20221024152935124

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

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

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

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

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

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

在这里插入图片描述

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

小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch+Python实现人体关键点检测

用PythonPytorch工程代码对人体进行关键点检测和骨架提取,并实现可视化。 使用背景: 物体检测为许多视觉任务提供动力,如实例分割、姿态估计、跟踪和动作识别。它在监控、自动驾驶和视觉答疑中有下游应用。当前的对象检测器通过紧密包围对象…

深度学习提高模型准确率方法

这里写目录标题深度学习数据使用更多数据更改图像大小减少颜色通道算法模型改进增加训练轮次迁移学习添加更多层调整超参数总结深度学习 我们已经收集好了一个数据集,建立了一个神经网络,并训练了模型,在测试和验证阶段最后得到的准确率不高…

8086通用寄存器

目录 概述 EU:负责执行指令完成两种操作:算数逻辑运算,计算存储器操作数的偏移地址 BIU:完成所有的总线操作 寄存器 AX BX CX DX SP,BP,SI,DI IP CS,DS,SS,ES 概述 8086和8088C…

神经网络每次结果不一样,神经网络预测问题

1、求助:神经网络两次训练的结果不一样 神经网络两次训练的结果不一样,这是因为每次训练的迭代初值不相同(是随机的),所以得到的结果是有差异的。一般的话,软件开启第一次时,运行得到结果是比较…

Java | 学习笔记02 快速之旅

运行已经开发好的Java程序,只需要JRE(Java运行时环境)就可以。但事实上,要想完成一个Java程序的开发,我们至少需要安装好JDK 目录 一、Java环境配置 1.下载JDK 2.配置环境变量 二、Hello World! 三、I…

关于C++、C++ CLI, Java、C# 的自定义类实现列表初始化。

1、C DList_类构造函数 /// <summary> /// 表表初始化 dList<int> idl {1,2,3,4}; /// </summary> /// <typeparam name"T"></typeparam> /// <param name"tList"></param> template<class T> inline …

一只脚踏进Java的大门

一杯热气腾腾的咖啡&#xff0c;没错&#xff0c;这就是Java的标志。学习Java&#xff0c;我们就从这杯咖啡开始。2022年10月24日&#x1f6a9; Hello Java!一、认识Java从Hello world开始二、运行Java程序1、编译运行原理2、JDK、JRE、JVM以及它们之间的关系3、运行步骤展示三…

C语言-简单的程序设计

&#x1f31e;欢迎来到C语言的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f320;本阶段属于练气阶段&#xff0c;希望各位仙友顺利完成…

docker 网络

前言 随着容器的普及&#xff0c;经常使用docker创建容器来跑应用&#xff0c;结合开源的kubernetes和istio等&#xff0c;对于无状态的服务有极好的支持能力&#xff0c;秒级调度&#xff0c;弹性伸缩等优势。实际上kube的容器仅仅是接口&#xff0c;实际的容器可以是docker&…

布隆过滤器

文章目录前导布隆过滤器特点映射方式hash 函数BloomFiltersettestreset相关问题应用示例哈希切分例子今天是1024程序员节,祝各位节日快乐啦!!!前导 我们之前使用位图bitset,只能将一个整数映射到比特位上&#xff0c;来判断某个数是否存在 但是假如我们也想把判断一个字符串是…

【Linux】yum 与 vim 的基本使用

文章目录一、yum 背景知识1、商业生态2、开源生态3、软件生态本土化二、yum 的基本使用1、查看软件包2、安装软件3、卸载软件三、vim 的基本使用1、vim 的基本概念2、vim 的基本操作2.1 模式间切换2.2 光标定位2.3 文本复制2.4 文本编辑2.5 底行模式的操作四、简单 vim 配置2、…

前端工程化<npm、cnpm、yarn、npx、pnpm等包管理工具>

平时工作中&#xff0c;像npm、cnpm、yarn等一些工具都是经常经常用的&#xff0c;但可能对里面的一些细节都没太在意&#xff0c;所以这篇就来总结一下加深印象和理解。另外还有pnpm的使用&#xff0c;以及它的优势 1. npm包管理工具 包管理工具npm Node Package Manager&a…

『Halcon与C#混合编程』011_工业相机的SDK介绍

这里以淘宝上的显微精工店铺的相机为例(支持SDK) 一、相机的SDK简单介绍 第一步:安装好驱动,并能正常打开相机 第二部:找到相机的安装目录,查看厂家提供的Demo和开发手册 在Demo中找到C#的Demo,运行Demo.sln 第三步

基于Matlab使用粒子滤波器和高斯滤波器跟踪单个对象(附源码)

此示例说明了如何使用粒子滤波器和高斯和滤波器来跟踪使用仅范围测量的单个对象。 一、介绍 只能观察范围信息的传感器无法通过单次检测提供对物体状态的完整了解。此外&#xff0c;当以笛卡尔坐标系表示时&#xff0c;仅范围测量的不确定性是非高斯的&#xff0c;并产生凹形…

python作业8

目录 1.输入一个整数判断奇数偶数 2.判断一个数是否能被7或11整除但不能同时整除 3.判断某一年是否为闰年&#xff1a;能被4整除但不能被100整除&#xff0c;或者能被400整除 4.《车辆驾驶人员血液、呼气酒精含量阈值与检验》标准中规定&#xff1a;驾驶员血液酒精小于20mg/…

基于Hi3861的听话的狗子

听话的狗子一、项目介绍二、硬件介绍&#xff08;1&#xff09;Hi3861最小系统电路&#xff08;2&#xff09;电源管理电路&#xff08;3&#xff09;USB转串口电路烧录电路&#xff08;4&#xff09;外设接口电路三、PCB设计四、软件部分简介&#xff08;1&#xff09;代码整体…

在 ESP 开发板上开发 UI 不再复杂

如果您尝试过在没有图形库的情况下开发 UI&#xff0c;那么您一定知道这有多困难。幸运的是&#xff0c;由乐鑫芯片驱动的屏幕&#xff0c;可支持用户使用多种图形库来开发 UI&#xff0c; LVGL 就是其中之一。通常情况下&#xff0c;在使用 LVGL 或类似的图形库前&#xff0c;…

SPI、RS232、485、IIC通信协议详细总结

通信协议大全 文章目录通信协议大全前言一、异步通信和同步通信二、RS232和RS4851.RS2322.RS4853.RS232和RS485的区别4.RS232、485与普通串口的区别&#xff1f;三、SPI协议四、IIC协议1.IIC的时序介绍2.IIC传输数据的格式总结前言 通信协议是每一个嵌入式工程师必备的技能。下…

几道简单的Linux驱动相关面试题,你看你会几题?

一、Linux基础 1、任意3种网络操作的Linux命令,并说明他们的含义 1. ifconfig 命令 ifconfig 用于查看和配置 Linux 系统的网络接口。 查看所有网络接口及其状态&#xff1a;ifconfig -a 。 使用 up 和 down 命令启动或停止某个接口&#xff1a;ifconfig eth0 up 和 ifconfi…

WEB渗透扫描与加固

WEB渗透扫描与加固 1.通过PC2中渗透测试平台BackTrack5中的httprint工具对服务器场景Server2003检测HTTP服务器(调用signatures.txt), 并将该操作显示结果“Banner Reported:”之后的字符串作为FLAG提交; 切换路径至/pentest/enumeration/web/httprint下 使用命令./httpr…