为 Python 打包创建一个世外桃源,解决打包太大且启动慢的问题
前言
在上一篇文章《结合 pyqt5 开发办公文档一键转换软件, 以后再也不用开会员转文件了》,在文章结尾留了一个小问题,如下图:
从上图可以看出,打包出来的 exe 文件大小大概有 300-400M 之间,而且这个打包过程极其漫长,我都生怕中间由于我其他操作中断了打包,上面的打包使用的是大家常用的 PyInstaller 进行打包。命令如下:
pyinstaller -F -w qtfile.py
那遇到这个问题什么原因呢?
首先是我用的是 Anaconda 的集成环境,由于 Anaconda 或者自己搭建的环境里内置了很多库,而且在日常的开发中又安装很多开发所需要的其他库,打包的时候就把很多不必要的模块打包进去,导致打包出来的文件过于臃肿.打开慢由于运行需要加载这些环境,由于加载的库过多导致耗时过长,而且 Python 是一门解释型语言,本身运行效率上也稍慢,所以能够明显体会到启动时的漫长等待
我们写代码就是为了高效,怎么能受得了打开慢且占资源的东西呢,那如何能解决这个问题呢?
最合适的就是为打包创建一个世外桃源,创建一个干净的虚拟环境,这个环境只需要包含程序中所需要的库即可,同样使用的是 pyinstaller 进行打包.
解决方法--创建虚拟环境
创建虚拟环境有很多方式:
1.可使用 anaconda 的虚拟环境创建工具,如果你跟我一样使用的是 anaconda 的集成环境,可使用此方式创建
创建命令:conda create -n 虚拟环境名字 python==3.6 #创建虚拟环境
激活命令:conda activate 虚拟环境名字 #激活虚拟环境
2.使用 pipenv 进行创建虚拟环境(安装:ip install pipenv)
3.使用 Python 自带的 venv 创建 Python 的虚拟环境
... ...
本文选择的是第 3 种方式,接下来就手把手带你体验 Python 的虚拟环境的创建以及 Python 程序的打包
Python 虚拟环境是一个可独立运行的环境
优点如下:
不同的虚拟环境相互独立,不会影响到其他应用的运行
避免出现包管理混乱和版本冲突.且虚拟环境可指定版本
不会影响全局的 python 环境,因为虚拟环境也是独立的运行的环境
创建流程
1.使用命令创建 Python 虚拟环境,进入你想安装虚拟机的目录,执行以下命令
注意:创建时注意创建的虚拟环境的 Python 版本.一定要跟你的程序的开发环境一致.以免安装相关模块时出现问题,且 pip 的版本要更新的最新版本
执行完你会看到出现一个 my_env 的文件夹
文件夹里面有基础的 Python 环境
进入 Scripts 文件夹,执行以下命令激活虚拟机:
激活之后就会进入虚拟环境,如下图所示:
使用 pip list 命令就可以看到一个干净的环境:
到这里创建虚拟环境就已经结束了,接着安装你需要打包的 python 程序所必需的库
因默认镜像可能下载极其慢,所以安装的时候最好使用国内镜像,比如豆瓣或者清华的镜像都可以
相关模块的库安装完成后开始执行程序打包:
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 可执行文件作为入口,其他为相关的库
静态打包:把所有模块全部打包进一个 exe 文件中
打包完就产生的文件在 dist 文件夹下面.
如果是静态打包只有一个单独的 exe 文件,如上图,使用虚拟环境打包,文件小了很多,只有 90M.大小只有之前的四分之一
如果是动态打包里面一个文件夹和你打包的 Python 文件的名字一致
总结
如果静态打包打开程序还是很慢可使用动态打包的方式.但是动态打包的文件很多.其实你可以把静态打包的文件当成静态打包的压缩版来理解,动态打包特别像我们平时安装的软件,相关的库和配置都有自己的文件夹,exe 文件就只是程序的启动入口,比如 pycharm 安装目录
版权声明: 本文为 InfoQ 作者【迷彩】的原创文章。
原文链接:【http://xie.infoq.cn/article/db5fb9cb676553e01c1c5bc17】。文章转载请联系作者。
评论