使用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_files

datas = []
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',
)


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于uniapp封装的table组件

数据格式 tableData: [{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},/* {title: "2",elcInfo: [{…

强化学习求解TSP:Qlearning求解旅行商问题(Traveling salesman problem, TSP)提供Python代码

一、Qlearning简介 Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获…

MySql 1170-BLOB/TEXT 错误

MySql 1170-BLOB/TEXT column idused in key specification without a key length 原因:由于将主键id设置为 text类型,所以导致主键 的长度,没有设置。 解决方案:方案1:将主键id设置为varchar 类型的,设置对应的长度…

new mars3d.graphic.ModelEntity({clampToGround:true,模型不贴地处理办法

问题&#xff1a; 1.new mars3d.graphic.ModelEntity({clampToGround:true,时&#xff0c;发现模型不贴地 2.推断原因是模型可能建模的时候&#xff0c;坐标原点数据不正确&#xff0c;无法贴地。 解决方案&#xff1a; <一>.在Mars3d的模型编辑调整页面&#xff0c;进…

【习题】应用程序框架

判断题 1. 一个应用只能有一个UIAbility。错误(False) 正确(True)错误(False) 2. 创建的Empty Ability模板工程&#xff0c;初始会生成一个UIAbility文件。正确(True) 正确(True)错误(False) 3. 每调用一次router.pushUrl()方法&#xff0c;页面路由栈数量均会加1。错误(Fal…

盖子的c++小课堂——第二十三讲:背包问题

前言 又是一次漫长的更新&#xff08;我真不是故意的aaaaaaaaaaaaaaa&#xff09;&#xff0c;先不多说了&#xff0c;直接给我~坐下~说错了说错了&#xff0c;直接开始~ 背包问题----动态规划 背包问题&#xff08;knapsack problem&#xff09; 动态规划&#xff08;dyna…

【Redis】非关系型数据库之Redis的主从复制、哨兵和集群高可用

目录 一、主从复制、哨兵、集群的区别 二、主从复制 2.1主从复制的作用 2.2主从复制的原理 2.3主从复制的实操 步骤一&#xff1a;环境准备 步骤二&#xff1a;安装Redis以及配置文件修改 Redis的主从配置文件都一样 步骤四&#xff1a;验证主从复制 三、哨兵 3.1哨兵…

numpy100练习题,包含相应使用函数解释

取自github开源项目&#xff1a;numpy100题 文章目录 1. 导入numpy库并简写为 np (★☆☆)2. 打印numpy的版本和配置说明 (★☆☆)3. 创建一个长度为10的空向量 (★☆☆)4. 如何找到任何一个数组的内存大小&#xff1f; (★☆☆)5. 如何从命令行得到numpy中add函数的说明文档?…

2024年1月9日学习总结

目录 学习目标学习内容联邦学习基础&#xff1a;why, what, howwhy&#xff1f;what&#xff1f;how&#xff1f; 联邦学习的例子——CIFAR-10数据集&#xff08;分类问题&#xff09;1、import libararies2、hyper-parameters3、加载并且划分数据4、创建神经网络模型5、helper…

Spark Core--加强

RDD的持久化 RDD缓存 当RDD被重复使用&#xff0c;或者计算该RDD比较容易出错&#xff0c;而且需要消耗比较多的资源和时间的时候&#xff0c;我们就可以将该RDD缓存起来。 主要作用: 提升Spark程序的计算效率 注意事项: RDD的缓存可以存储在内存或者是磁盘上&#xff0c;甚至…

RBAC权限管理概念

基于RBAC模型的权限设计&#xff1a;如何设计系统权限体系&#xff1f; | 人人都是产品经理 一&#xff0c;什么是RBAC RBAC(基于角色的权限控制)模型的核心是在用户和权限之间引入了角色的概念。取消了用户和权限的直接关联&#xff0c;改为通过用户关联角色、角色关联权限的…

虾皮如何查看自己的店铺

在虾皮&#xff08;Shopee&#xff09;平台上查看自己的店铺是非常重要的&#xff0c;因为它可以帮助您了解店铺的运营情况、管理商品和处理客户服务等。下面是在虾皮平台上查看店铺的步骤&#xff1a; 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#xff08;复制…

nn网络层-卷积层

一、1d/2d/3d Convolution 卷积运算&#xff1a;卷积核在输入信号&#xff08;图像&#xff09;上滑动&#xff0c;相应位置上进行乘加卷积核&#xff1a;又称为滤波器&#xff0c;过滤器&#xff0c;可认为是某种模式&#xff0c;某种特征。卷积过程类似于用一个模版去图像上…

【JAVA】怎么确保一个集合不能被修改

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 示例&#xff1a; 不可修改的List&#xff1a; 不可修改的Set&#xff1a; 不可修改的Map&#xff1a; 结语 我的其他博…

强化学习在生成式预训练语言模型中的研究现状简单调研

1. 绪论 本文旨在深入探讨强化学习在生成式预训练语言模型中的应用&#xff0c;特别是在对齐优化、提示词优化和经验记忆增强提示词等方面的具体实践。通过对现有研究的综述&#xff0c;我们将揭示强化学习在提高生成式语言模型性能和人类对话交互的关键作用。虽然这些应用展示…

STM32F103C8T6内部自带Bootloader模式之使用FlyMcu烧写程序

简介 实现自己的Bootloader前, 使用一下STM32内部自带的Bootloader对STM进行烧写 步骤 下载FlyMCU 参考 普中STM32-PZ6806L 使用FlyMcu串口烧录程序 Boot选择 Boot0->1 , Boot1->0 进到系统存储器 打开FlyMCU 1 选择串口波特率 2 选择程序 3 不需要使用辅助引脚 4 开…

Linux网络配置与抓包工具介绍

目录 一、配置命令 1. ifconfig 1.1 概述信息解析 1.2 常用格式 2. ip 2.1 ip link 数据链路层 2.2 ip addr 网络层 2.3 路由 3. hostname 3.1 临时修改主机名 3.2 永久修改主机名 4. route 5. netstat 6. ss 7. ping 8. traceroute 9. nslookup 10. 永久修…

书生·浦语大模型全链路开源体系 学习笔记 第三课

huggingface-cli: command not found 按照该文档解决即可 https://github.com/huggingface/huggingface_hub/issues/1079 具体如下&#xff1a; 1、确保环境已将安装huggingface-cli 2、版本需要旧版&#xff0c;pip install huggingface_hub0.20.1 3、再按如下执行 # T…

WCF几种寄宿方式IIS、Winform、控制台、Windows服务

WCF寄宿方式是一种非常灵活的操作,可以在IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。本文分别对这几种方式进行详细介绍并开发例子进行说明,以求大家对WCF寄宿的方式进行全面的认识和了解。 1、 WC…

计算机毕业设计 基于SpringBoot的项目申报系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…