当前位置:首页 > 技术 > 正文内容

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题

Lotus2022-11-28 14:17技术

前言

在上一篇文章《​结合 pyqt5 开发办公文档一键转换软件, 以后再也不用开会员转文件了​》,在文章结尾留了一个小问题,如下图:

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_pyinstaller

从上图可以看出,打包出来的exe文件大小大概有300-400M之间,而且这个打包过程极其漫长,我都生怕中间由于我其他操作中断了打包,上面的打包使用的是大家常用的PyInstaller进行打包。命令如下:

​pyinstaller -F -w qtfile.py​

那遇到这个问题什么原因呢?

首先是我用的是Anaconda的集成环境,由于Anaconda或者自己搭建的环境里内置了很多库,而且在日常的开发中又安装很多开发所需要的其他库,打包的时候就把很多不必要的模块打包进去,导致打包出来的文件过于臃肿.打开慢由于运行需要加载这些环境,由于加载的库过多导致耗时过长,而且Python是一门解释型语言,本身运行效率上也稍慢,所以能够明显体会到启动时的漫长等待

我们写代码就是为了高效,怎么能受得了打开慢且占资源的东西呢,那如何能解决这个问题呢?

最合适的就是为打包创建一个世外桃源,创建一个干净的虚拟环境,这个环境只需要包含程序中所需要的库即可,同样使用的是pyinstaller进行打包.

解决方法--创建虚拟环境

创建虚拟环境有很多方式:

1.可使用anaconda的虚拟环境创建工具,如果你跟我一样使用的是anaconda的集成环境,可使用此方式创建

​创建命令:conda create -n 虚拟环境名字 pythnotallow==3.6  #创建虚拟环境​

​激活命令:conda activate 虚拟环境名字  #激活虚拟环境​

2.使用pipenv进行创建虚拟环境(安装:ip install pipenv)

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_虚拟环境_02

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_pyinstaller_03

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_pyinstaller_04

3.使用Python自带的venv创建Python的虚拟环境

... ...

本文选择的是第3种方式,接下来就手把手带你体验Python的虚拟环境的创建以及Python程序的打包

Python虚拟环境是一个可独立运行的环境

优点如下:

  1. 不同的虚拟环境相互独立,不会影响到其他应用的运行
  2. 避免出现包管理混乱和版本冲突.且虚拟环境可指定版本
  3. 不会影响全局的python环境,因为虚拟环境也是独立的运行的环境

创建流程

1.使用命令创建Python虚拟环境,进入你想安装虚拟机的目录,执行以下命令

注意:创建时注意创建的虚拟环境的Python版本.一定要跟你的程序的开发环境一致.以免安装相关模块时出现问题,且pip的版本要更新的最新版本

python -m venv my_env(这个是虚拟机的名字了自己定义)

执行完你会看到出现一个my_env的文件夹

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_当前目录_05

文件夹里面有基础的Python环境

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_pyinstaller_06

进入Scripts文件夹,执行以下命令激活虚拟机:

activate

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_Python程序打包_07

激活之后就会进入虚拟环境,如下图所示:

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_python_08

使用pip list命令就可以看到一个干净的环境:

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_Python程序打包_09

到这里创建虚拟环境就已经结束了,接着安装你需要打包的python程序所必需的库

打包完,如果想退出虚拟机命令如下:

#直接输入exit
>exit

因默认镜像可能下载极其慢,所以安装的时候最好使用国内镜像,比如豆瓣或者清华的镜像都可以

pip install -i https://pypi.douban.com/simple/ 你要安装的安装包名 #豆瓣源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 你要安装的安装包名 #清华源

相关模块的库安装完成后开始执行程序打包:

pyinstaller打包参数解析

-F,-onefile : 产生单个的可执行文件

-D,–onedir : 产生一个目录(包含多个文件)作为可执行程序

-a,–ascii : 不包含 Unicode 字符集支持

-d,–debug : 产生 debug 版本的可执行文件

-w,–windowed,–noconsolc : 指定程序运行时不显示命令行窗口(仅对 Windows 有效)

-c,–nowindowed,–console : 指定使用命令行窗口运行程序(仅对 Windows 有效)

-o DIR,–out=DIR : 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件

-p DIR,–path=DIR : 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径

-n NAME,–name=NAME : 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

常用打包命令:

动态打包:产生一个目录(包含多个文件)作为可执行程序,里面有exe可执行文件作为入口,其他为相关的库

pyinstaller -D -w -i=logo.ico qtfile.py
#test.py就是你的程序路径,如果你的程序不是在当前目录下,可使用绝对路径如:E:/test/qtfile.py

静态打包:把所有模块全部打包进一个exe文件中

pyinstaller -F -w -i=logo.ico qtfile.py
#test.py就是你的程序路径,如果你的程序不是在当前目录下,可使用绝对路径如:E:/test/qtfile.py

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_Python程序打包_10

打包完就产生的文件在dist文件夹下面.

如果是静态打包只有一个单独的exe文件,如上图,使用虚拟环境打包,文件小了很多,只有90M.大小只有之前的四分之一

如果是动态打包里面一个文件夹和你打包的Python文件的名字一致

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_虚拟环境_11

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_Python程序打包_12

总结

如果静态打包打开程序还是很慢可使用动态打包的方式.但是动态打包的文件很多.其实你可以把静态打包的文件当成静态打包的压缩版来理解,动态打包特别像我们平时安装的软件,相关的库和配置都有自己的文件夹,exe文件就只是程序的启动入口,比如pycharm安装目录

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_当前目录_13

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题_Python程序打包_14

原文链接

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/1051.html

分享给朋友:

“为Python打包创建一个世外桃源,解决打包太大且启动慢的问题” 的相关文章

IPv6报文头深度解析

IPv6报文由IPv6基本报文头、IPv6扩展报文头以及上层协议数据单元3部分组成。上层协议数据单元一般由上层协议报文头和它的有效载荷构成,上层协议数据单元可以是一个ICMPv6报文、一个TCP报文或一个UDP报文。 1、IPv6基本报文头 IPv6基本报文头有8个字段,固定大小为40 Byte,每一个IPv6数据报都必须包含基本报文头。基本报文头提供报文转发的基本信息,由转发路径上的所有设备解...

Docker入门学习

1.运行第一个docker容器 docker run -i -t ubuntu /bin/bash 参数说明: -i, --interactive=false, 打开STDIN,用于控制台交互-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false-d, --detach=false, 指定容器运行于前台还是后台,默认为false 首先,docker run -it...

激活数据价值,探究DataOps下的数据架构及其实践丨DTVision开发治理篇

据中国信通院发布,2012 年到 2021 年 10 年间,我国数字经济规模由 12 万亿元增长到 45.5 万亿元,在整个 GDP 中的比重由 21.6% 提升至 39.8%。顺应时代发展新趋势,“数据” 成为新的生产要素已是毋庸置疑的共识。 如果说数据中台的崛起代表着企业数字化转型从流程驱动走向数据驱动,从数字化走向智能化。那么 DataOps,则是实现数据中台的一个优秀的理念或方法论。 D...

【C语言练习_2】用C语言实现凯撒密码加密解密

1.凯撒密码简介 又叫循环移位密码.它的加密方法是将明文中的每个字母用此字符在字母表中后面第k个字母替代.它的加密过程可以表示为下面的函数:E(m)=m+k(mod n) 其中:m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数. 2.代码 #include <stdio.h>#include <string.h>...

css:利用伪类处理图片加载失败的样式问题

实现效果 实现代码 index.html <h2>未做错误处理</h2> <div style="font-size: 0"> <img src="./img/image.jpg" alt="" /> <img src="./img/image-1.jpg" alt="" /> &l...

devops学习笔记-jenkins实现基础CI/CD操作

在之前的devops工具链中完成了jenkins以及gitlab配置之后,可以实现基础的CI/CD操作。 操作流程 整体的操作的流程如下所示: 在开发环境配置好代码之后,将代码上传到gitlab,jenkins拉取gitlab的代码,由maven插件build,打包好后,构建 docker镜像,上传到目标服务器中运行,可以通过tag选择版本代码。 本地编写代码 使用idea编写一个基础的spr...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。