使用pyinstaller打包生成exe(解决gradio程序的打包问题)

解决 [Errno 2] No such file or directory: gradio_client\types.json 问题,不需要手动创建hook文件
解决 FileNotFoundError: [Errno 2] No such file or directory: gradio\blocks_events.pyc 问题,不需要将pyi文件重命名为pyc文件

最终实现gradio程序的打包运行,具体效果如下所示
在这里插入图片描述

1、打包工具介绍

Python打包生成可执行文件的工具有很多,以下是一些常用的工具,根据对工具效果的调研,发现PyInstaller是最简单易用的。然而使用pyinstaller打包生成exe程序时,常常存在生成的exe占用空间较大的情况。这是因为pyinstaller打包是将环境内的不相干的库都打包进去了,故而需要创建干净的虚拟python环境。

  • PyInstaller:PyInstaller是一个开源的Python应用程序打包工具,可以将Python代码打包为可执行文件。它支持Windows、Linux、Mac OS X等操作系统,并且支持Python 2和Python 3。优点是易于使用,可移植性好。

  • cx_Freeze:也是一个常用的Python打包工具,能够把Python脚本打包成可执行文件,在安装Python解释器的机器上运行,并提供freeze后的程序真正运行所需要的库和动态链接库文件。支持多个平台。其使用可以参考:https://zhuanlan.zhihu.com/p/150370561

  • Py2exe:Py2exe是Python2.x的打包工具,可以把Python代码转换成Windows下的可执行文件,方便在没有安装Python程序的机器上使用,支持多个平台。

  • PyOxidizer:PyOxidizer是一个新的打包工具,支持将Python代码打包成单个的可执行文件,能够自动处理Python库和其他依赖项,支持Windows、Linux和Mac等多个平台。使用PyOxidizer,首先需要按照Rust环境. 其使用可以参考:http://wwj718.github.io/post/%E7%BC%96%E7%A8%8B/building-standalone-python-applications-with-pyoxidizer/

  • Nuitka:Nuitka使用了多线程和协程技术,在编译时能够更有效地利用系统资源,提高编译速度。Nuitka支持Python 2.6、2.7、3.4-3.11的多个版本,因此对于需要兼容不同Python版本的开发者来说,Nuitka是一个不错的选择。由于Nuitka需要将Python代码编译成C级别的程序,因此在编译过程中需要占用较多的系统资源。相对于其他打包工具,Nuitka的使用较为复杂,需要一定的学习成本。

  • Py2app:py2app支持Mac OS X、Windows、Linux等多个操作系统,因此对于需要将Python应用程序打包到不同平台的开发者来说,py2app是一个不错的选择。py2app的使用相对简单,只需要通过简单的命令行操作即可完成打包过程。py2app只支持Python 2.x版本

2、python下虚拟环境

Python创建虚拟环境的工具有以下几种。常见的是venv与conda,pipenv用于创建轻量化的python虚拟环境,conda通常用于创建训练深度学习模型的环境。针对打包,创建虚拟环境时,我们通常考虑使用conda。

pipenv: pipenv 是一款比较新的包管理工具,其借鉴了 javascript 的 npm 和 PHP 的 composer 等理念,通过一个依赖描述文件 Pipfile 来安装和管理依赖,以达到协同开发的目的。pipenv的使用可以参考:https://zhuanlan.zhihu.com/p/37581807

venv:venv是Python内置的一个模块,可以用于创建虚拟环境。它简单易用,不需要额外安装其他工具。python虚拟环境管理工具venv教程可以参考:https://zhuanlan.zhihu.com/p/341481537

virtualenv:virtualenv是一个第三方库,可以用于创建独立的Python虚拟环境。它支持多种操作系统,并且可以与pip集成使用。python虚拟环境管理工具virtualenv教程可以参考:https://zhuanlan.zhihu.com/p/338424040

conda:conda是一个开源的包管理系统和环境管理系统,可以用于创建和管理虚拟环境。它支持多种操作系统,并且可以安装多个版本的Python。conda的使用可以参考:https://blog.csdn.net/chenxy_bwave/article/details/119996001

pyenv:pyenv是一个管理多个Python版本的工具,也可以用来创建虚拟环境。它可以在同一台机器上安装多个Python版本,并且可以轻松切换。pyenv的使用可以参考 https://zhuanlan.zhihu.com/p/349339696

2.1 pipenv使用说明

使用pipenv、virtualenv创建的环境,存在无法导入ssl库的问题,目前无法解决。
基本说明
安装命令 pip install pipenv

使用环境
使用pipenv创建虚拟环境 pipenv shell,可以看到通过该命令生成的虚拟环境是干净的,但是通过该命令创建的虚拟环境是临时的。同时,该环境中不包含ssl,故在进行pip安装包时,需要指定源,具体可以参考 :pip install onnxruntime -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
在这里插入图片描述

补充说明 通过以下步骤创建的虚拟环境没有实际价值
创建制定名称的虚拟环境 virtualenv xnhj ,这里的xnhj是我的环境名称(按个人情况修改),执行完命令后,在终端有以下输出
在这里插入图片描述
同时在对应的文件下生成了一个叫xnhj的目录
在这里插入图片描述
使用 xnhj\Scripts\activate 激活环境,其中为虚拟环境的名称,可以发现该虚拟环境有很多父环境的包。这种情况下不适合进行打包
在这里插入图片描述

3、使用pyinstaller打包生成exe

3.1 使用conda创建虚拟环境

创建虚拟环境 conda create -n py38 python=3.8,一直默认点回车就行

conda create -n your_env_name python=x.x

查看目前有哪些虚拟环境

conda env list 
conda info -e

在这里插入图片描述
使用虚拟环境 activate py38

Linux:  source activate your_env_nam
Windows: activate your_env_name

3.2 在虚拟环境中安装依赖包

在虚拟环境中安装包的命令如下所示,package_name 是你要安装的包名

pip install package_name -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

以下命令一共安装了,要运行代码的依赖库。

pip install onnxruntime -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip install gradio -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip install cryptography -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip install opencv-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip install pyinstaller -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip install pyOpenSSL -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

依赖包安装好后,要先在虚拟环境里执行一遍要打包的代码,看是否有遗漏的。

3.3 进行打包

使用命令 pyinstaller -F python_file_name 进行打包,其输出如下所示
在这里插入图片描述
其在目录下的dist文件中生成了exe文件,具体如下所示
在这里插入图片描述
正常来说,双击程序即可运行,如果打开程序闪退,则可以在cmd中输入程序名称执行,查看具体报错原因。
在这里插入图片描述

[Errno 2] No such file or directory: gradio_client\types.json
这是由于pyinstaller 没有准确的识别出用于代码中gradio_client与gradio库的依赖项,很多的博客都是说需要再pyinstaller的hook目录下添加文件,实则没有必要。需要将打包命令修改下命令即可,也就是补充上 --collect-data=gradio_client --collect-data=gradio ,完整命令如下:
pyinstaller -F python_file_name --collect-data=gradio_client --collect-data=gradio

再次执行时出现以下报错

FileNotFoundError: [Errno 2] No such file or directory: gradio\blocks_events.pyc

这是由于gradio库中的代码都是pyi文件,而pyinstaller 在打包时默认库中的都是pyc文件,故而需要修改spec文件,指定对gradio库下的代码进行编译。
具体操作如下:
1、生成spec文件 pyi-makespec --collect-data=gradio_client --collect-data=gradio python_file_name
在这里插入图片描述
2、打开与要打包py代码同名的spec文件,添加对gradio的编译

module_collection_mode={ 'gradio': 'py',}
在这里插入图片描述
修改后,删除掉目录下的build文件夹,再次执行 pyinstaller python_file_name.spec 即可,具体如下图所示
在这里插入图片描述然后进入dist目录,找到exe文件,执行效果如下在这里插入图片描述

3.4 生成单个文件

使用以下spec文件可以生成单个exe文件

# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_data_filesdatas = []
datas += collect_data_files('gradio_client')
datas += collect_data_files('gradio')a = Analysis(['08.onnxgradio.py'],pathex=[],binaries=[],datas=datas,hiddenimports=[],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],noarchive=False,module_collection_mode={ 'gradio': 'py',}
)
pyz = PYZ(a.pure)exe = EXE(pyz,a.scripts,a.binaries,a.datas,[],name='08.onnxgradio',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=True,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)
coll = COLLECT(exe,a.binaries,a.datas,strip=False,upx=True,upx_exclude=[],name='08.onnxgradio',
)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql忘记root密码后怎么重置

mysql忘记root密码后重置方法【windows版本】 重置密码步骤停掉mysql服务跳过密码进入数据库在user表中重置密码使用新密码登录mysql到此,密码就成功修改了,完结,撒花~ 重置密码步骤 当我们忘记mysql的密码时,连接mysql会报这样的…

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通 2024/1/9 10:46 缘起:使用友善之臂的Android11可以让EC20上网,但是同样的修改步骤,Toybrick的Android11不能让EC20上网。 最后确认是selinux的问题&#…

控制论和科学方法论

《控制论与科学方法论》,真心不错。 书籍原文电子版PDF:https://pan.quark.cn/s/aa40d59295df(分类在学习目录下) 备用链接:https://pan.xunlei.com/s/VNgj2vjW-Hf_543R2K8kbaifA1?pwd2sap# 控制论是一种让系统按照我…

git克隆失败提示RPC failed的解决方法

现象 $ git clone https://github.com/guillemj/dpkg.git Cloning into dpkg... remote: Enumerating objects: 113312, done. remote: Counting objects: 100% (18045/18045), done. remote: Compressing objects: 100% (3915/3915), done. error: RPC failed; curl 18 trans…

Python——通过统计图像像素值初步分析图像噪声类型

图像噪声是指图像中不随真实场景变化而变化的随机干扰。噪声会影响图像的质量,因此需要对其进行去噪处理。 目录 一、图像噪声1.1 噪声类型1.2 结合峰度和偏度判断噪声1.2.1 峰度和偏度1.2.2 常见噪声的峰度和偏度 二、代码三、测试结果四、总结 一、图像噪声 图像…

CloudCompare——拟合空间球

目录 1.拟合球2.软件操作3.算法源码4.相关代码 本文由CSDN点云侠原创,CloudCompare——拟合空间球,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 1.拟合球 源码里用到了四点定球,…

数学建模-Matlab R2022a安装步骤

软件介绍 MATLAB是一款商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程…

给自己创建的GPTs添加Action(查天气)

前言 在这篇文章中,我将分享如何利用ChatGPT 4.0辅助论文写作的技巧,并根据网上的资料和最新的研究补充更多好用的咒语技巧。 GPT4的官方售价是每月20美元,很多人并不是天天用GPT,只是偶尔用一下。 如果调用官方的GPT4接口&…

设备树在开发板的系统中的体现

一. 简介 设备树文件中的设备节点,可以在开发板系统中看到。 也就说,开发板加载设备树文件,Linux内核启动系统以后,可以在根文件系统里看到设备树的节点信息。在/proc/device-tree/目录下存放着设备树信息。 二. 设备树在开发板…

CDN加速之HTTPS配置

记录一下HTTPS配置的免费证书配置 2张图搞定 最后补充说明: 由于CDN采用的Tengine服务基于Nginx,因此开启HTTPS安全加速功能的加速域名,只支持上传Nginx能读取的PEM格式的证书。如果证书不是PEM格式,需转换成PEM格式。转换方法&a…

python 队列

队列常用方法 Python中的队列是一种数据结构,遵循先进先出(FIFO)的原则。在Python中,你可以使用内置模块queue提供的Queue类来实现队列数据结构。队列是一种常见的数据结构,用于按照特定顺序处理数据项,例…

上市公司-是否数字化转型数据集(2000-2022年)

参照《经济评论》中张欣(2023)、《中国工业经济》中巫强(2023)的做法,团队对上市公司-是否数字化转型进行测算。若年报中出现数字化转型的关键词,则视企业的是否数字化转型赋值为1,否则为0。使用…