使用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文件,执行效果如下在这里插入图片描述

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

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

相关文章

手撕 PCA

PCA(Principal Component Analysis),中文名称:主成分分析。迄今为止最流行的降维算法。 假设 n 维空间中的一个单位立方体,易知:一维空间中该立方体中任意两点的距离不超过 1 1 1,二维空间中该…

自动连接校园网(河海大学)

layout: post # 使用的布局(不需要改) title: 自动连接校园网(河海大学) # 标题 subtitle: 网络 #副标题 date: 2024-01-09 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catal…

GAMES101-Assignment4

一、问题总览 实现de Casteljau算法来绘制由4个控制点表示的Bzier曲线。需要修改main.cpp中的如下函数: bezier:该函数实现绘制Bzier曲线的功能。它使用一个控制点序列和一个OpenCV::Mat对象作为输入,没有返回值。它会使t在0到1的范围内进行…

Python采集微博评论做词云图

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 第三方模块使用: import requests >>> pip install requests import wordcloud >>> pip install wordclou…

扩展学习|数据融合助推商务智能与分析

文献来源:[1]李爱华,续维佳,石勇.基于数据融合的商务智能与分析架构研究[J].计算机科学,2022,49(12):185-194. 一、信息融合 (一)信息融合定义演变 早期信息融合的定义指出,其主要任务是综合分析若干传感器观测到的信息[9,…

微信小程序canvas画布实现矩形元素自由缩放、移动功能

获取画布信息并绘制背景 .whml <canvas class="canvas" type="2d" id="myCanvas" bindtouchstart="get_rect_touch_position" bindtouchmove="move_or_scale" bind:tap="finish_edit_check"/> .wxss .c…

【案例实战】业务稳定性运行之全链路混合压测

1.全链路压测开展步骤 &#xff08;1&#xff09;什么是全链路压测 全链路压测是指基于真实业务场景&#xff0c;通过模拟海量的用户请求&#xff0c;对整个后台服务进行压力测试&#xff0c;从而评估整个系统的性能水平。 对应用程序的整个技术栈进行完整的压力和性能测试&a…

关于24年信息系统项目管理师论文如何提升?

信息系统项目管理师论文满分是75分&#xff0c;45分及以上为及格&#xff0c;论文评分可分为优良、及格与不及格3个档次。 评分的分数可分为&#xff1a; &#xff08;1&#xff09;60分至75分优良&#xff08;相当于百分制80分至100分&#xff09;。 &#xff08;2&#xf…

数模学习day09-cftool使用

老版本的MATLAB可以在命令行使用cftool打开&#xff0c;2017a的版本可以直接找到。 x和y在你的工作区中需要已经存在&#xff0c;然后打开该工具箱就可以看见。 选择X和Y xy选择好之后就自动画好了拟合曲线。 Results分析 画好之后结果就呈现在这里了 这里的p1就是拟合系数&…

用React给XXL-JOB开发一个新皮肤(一):环境搭建和项目初始化

目录 一. 简述二. Fork 项目三. 搭建开发环境四. 初始化皮肤项目五. 添加相关依赖六. 预览 一. 简述 大名鼎鼎的 xxl-job 任务调度中心我们应该都使用过&#xff0c;项目地址&#xff1a;xxl-job。它是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单…

【代码随想录】刷题笔记Day48

前言 早上练车去了&#xff08;好久没有8点前醒了&#xff09;&#xff0c;练科目二两小时下来脚根可真酸啊&#xff0c;希望下周一把过。练完顺带去Apple西湖免费换新了耳机&#xff0c;羊毛爽&#xff01; 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;…

JS逆向之无限debugger对抗

文章目录 JS中实现debugger的方法无限Debugger示例Demo1Demo2Demo3Demo4总结 无限Debugger实战 JS中实现debugger的方法 首先&#xff0c;我们要知道&#xff0c;在浏览器实现debugger的方法有哪些 debugger关键词 &#xff0c;相当于C内联汇编的int3&#xff0c;在代码中嵌入…

网工内推 | 运维工程师,国企、上市公司,RHCE认证优先

01 广东机场白云信息科技股份有限公司 招聘岗位&#xff1a;基础架构运维工程师&#xff08;中级&#xff09; 职责描述&#xff1a; 1、参与公司业务系统的监控、巡检、维护、故障定位、原因分析&#xff1b; 2、负责业务系统的上线、升级割接工作&#xff1b; 3、负责服务器…

Unity 踩坑记录 AnyState 切换动画执行两次

AnySate 切换动画 Can Transition To Self 将这个勾选去掉&#xff01;&#xff01;&#xff01;

Python学习之路-Hello Python

Python学习之路-Hello Python Python解释器 简介 前面说到Python是解释型语言&#xff0c;Python解释器的作用就是用于"翻译"Python程序。Python规定了一个Python语法规则&#xff0c;根据该规则可编写Python解释器。 常见的Python解释器 CPython&#xff1a;官方…

文件或目录损坏的磁盘修复方法

文件或目录损坏是一种常见的计算机问题&#xff0c;可能由多种原因导致&#xff0c;如磁盘故障、病毒或恶意软件攻击、文件系统错误等。这些损坏可能导致数据丢失或无法访问文件&#xff0c;因此及时修复至关重要。本文将深入探讨文件或目录损坏的原因&#xff0c;并提供相应的…

试用统信服务器操作系统UOS 20

作者&#xff1a;田逸&#xff08;formyz&#xff09; 试用统信Linux操作系统UOS&#xff0c;想了解一下用已有的Linux经验能否轻松驾驭它。以便在某些场景下&#xff0c;可以多一种选择。本次试验在Proxmox VE 8&#xff08;以下简称PVE 8&#xff09;平台下进行&#xff0c;采…

唠一唠Java线程池

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Java线程池&#xff0c;如果没有线程池&#xff0c;每个线程都需要手动创建和销毁线程&#xff0c;那将是多么低效和耗资源啊&#xff01; 线程池的核心作用就是复用已创建的线程&#xff0c;减少…

一个初级测试工程师的经历--我在阿里的两年

工作两年了&#xff0c;我一直希望让自己每年对测试的理解更深入一层。 谈轮了自己对各种测试的理解&#xff0c;这一年来&#xff0c;虽然对那些理概念的有所加强&#xff0c;自我感觉没有什么质的变化。前些天听我们公司的一位测试经理讲《敏捷测试》豁然开朗。他在学造飞机&…