获取更多文章和更新,请关注我的个人主页:www.leiting6.cn
常用打包工具
关于Python项目打包成可执行文件发布出来已经不是新鲜话题了,目前应用比较多的场景是在Windows和Mac环境下。大家比较常用的打包工具如下。
1. pye2exe for Windows
停更与2014年,目前只支持py2.x和py3.0-3.4;之前我自己编写的几个PyQt5工具一直用py2exe打包的,体积相对比较小,但是这几次打包总是遇到各种各样的错误,而且应用到的某些第三方库已经要求py3.5+的Python环境了,无奈只能抛弃。
2. pyinstaller for Windows and Mac
一直在更新,支持py2.7和py3.4-3.7,功能强大,Windows和Mac平台都可以使用。
3. py2app for Mac
Mac环境下使用较多的打包工具,功能比较齐全,可以通过setup.py来对打包操作进行配置。
所谓“完整打包”和“轻打包”
完整打包
介绍
完整打包即把Python脚本主体打包成当前操作系统环境下的可执行文件并附带上所需要的第三方库,一般包含各种动态链接库和其他组件。比如下面截图是我去年用PyQt5编写的一个adb工具,除了PyQt5库外,还使用了configparer库(一个用于读写ini配置文件的第三方库),以及几个Python自带的组件。这个小工具其实功能并不复杂,只是需要PyQt5来完成GUI绘制,但体积却有50+M。文件夹里面选中的部分为和PyQt5直接相关的组件,其大小总和已经达到20+M。这就是Python项目完整打包的弊端:体积过大。有兴趣的朋友可以试验一下,创建一个py脚本,只写两三句特别简单的语句,甚至不import任何模块,然后用上述几种打包软件打包成exe或者app看看成品的体积大小如何。
弊端
- 打包后体积大,比较占用空间,不方便传输
- 每次源码更新都需要重新打包,相对来说更新软件也动作也会比较大
优势
- 包含所有需要的组件,不依赖Python环境,不依赖第三方模块,拷贝到其他机器上可以直接运行使用
轻打包
介绍
轻打包说白了,就是创建一个启动入口,一键启动Python脚本,当然,如果你愿意,可以放一个快捷方式在桌面,不过在Windows上,py脚本文件不处理的话打开会有cmd窗口,而且不能固定到任务栏或者开始菜单;在Mac上,不能指定图标,而且也不好放在LaunchPad里。所以还是生成一个exe或者app更好,嗯,反正我是信了!很明显,这得要求脚本源文件保持在磁盘的某个位置不能随意移动,而且Python环境和依赖也是必须安装的。
弊端
- 操作系统必须安装完整的Python坏境
- 使用某个程序得安装这个程序所必须的第三方库
- 脚本源文件必须放在磁盘中,不能随意移动
- 随着项目更新,可能得随之更新Python版本和第三方库的版本以及安装新的依赖库
- 项目开发者有必要告知用户需要安装的Python版本和以及库版本
优势
- 如果项目更新不涉及Python环境和第三方库的改动,可以只更新脚本文件,而不用重新打包
- 启动程序轻量级,而且用户自行打包也十分容易操作
- 软件内检查更新功能编写简单,只需要更新有更改过的脚本文件即可(如果没有其他组件需要更新的情况下)
开发建议
完整打包和轻打包都是有可取之处的,但如果项目开发初版就基本定型,后续不会涉及重大改变,只是修补脚本的逻辑和在之前的基础上增删改功能,可能我还是更推荐轻打包,毕竟如上面所说,打包之后软件更新也十分简单,只需要单独编写一个update.py,更新有改动的脚本文件即可。
对于开发者而言呢,我觉得需要注意的部分,是一开始就要对项目做好规划,确定使用的环境和依赖,避免后续的使用麻烦,而对于像编写PyQt5之类项目,我们一定要:
尽量使用PyQt5和Python自带的功能!!!
尽量使用PyQt5和Python自带的功能!!!
尽量使用PyQt5和Python自带的功能!!!
因为PyQt5本身涵盖的功能非常广,比如我上面提到的处理ini配置文件的功能,其实PyQt5也是有的,所以完全可以少安装一个第三方库;其他比如系统剪贴板的操作、数据库的操作等等,PyQt5都是支持的。
轻打包步骤
下面简要介绍一下Windows下和Mac下对Python项目进行轻打包的步骤,至于Linux...你都拿Linux当使用环境了,也不会来看这个教程了。打包操作以我在github上发布的七牛云助手项目为例子。
Windows下
1. 安装Python环境
这个项目我使用的Python3.6调试的,点击跳转Python官网下载。安装的时候记得勾上Add PATH,这样Python的目录就会加到环境变量里面去。
不出意外,安装完成后打开cmd,输入
python
,就能看到命令行已经进入了Python解释器。输入
pip3
,也能看到pip工作正常,这是Python安装依赖的工具。如果cmd不能识别到
python
命令和pip3
命令,可以再次运行安装包选择repair,
2. 安装第三方库
需要安装3个第三方库,分别是:PyQt5图形库,configparser库和PIL库和打包用的pyinstaller。
pip3 install pyqt5
pi3 install configparser
pip3 install pillow
pip3 install pyinstaller
其中PyQt5安装的时候比较久,耐心等待。
3. 尝试运行
下载项目打包文件,解压到任意文件夹,在命令行中cd到当前目录,当然也可以在没选中任何文件的情况下按住shift鼠标右键点击空白处,选择在此处打开powershell。输入:python QiniuHelper.py
启动主程序。
简单操作一下,没什么问题的话就说明环境已经搭建完成了。
4. 进行打包
下面骚操作来了(敲黑板),同学们看好。在项目目录下新建一个run.py(后续我会把这个脚本放到项目源码中去),里面只需要两行代码:
import os
os.system('start pythonw QiniuHelper.py')
接着还是在cmd窗口中,cd到项目目录,执行以下命令:
pyinstaller -F -w -i icon.ico run.py
其中:
- pyinstaller是执行打包的命令,刚才通过pip安装的
- -F表示打包成单个exe文件,不会把组件放到exe外
- -w表示执行时不显示cmd窗口
- -i icon.ico 表示使用icon.ico作为图标
-
run.py表示将要打包的py脚本对象
不一会,就会在项目目录下生产一个build文件夹和dist文件夹,而dist文件夹下有一个run.exe文件,大小4-5M,我们把它复制到项目目录,双击运行。Duang!不出意外,程序界面就会成功跳出来了。
5. 后续
后续我会把run.py和打包操作的bat文件放到项目中去,用户一键生成就好。
Mac下
1. 安装Python环境
同样,从Python官网下载适用于Mac的Python3.6安装包。安装过程比较简单,一路继续就行了。安装完成后,打开Mac的终端工具,输入python3
和pip3
都没有提示命令找不到就说明安装成功了。之所有python和pip命令后面都需要加个3,是因为Mac OS一般都自带Python2.7,在Python3.x环境下开发的软件用Python2.7的解释器打开肯定是会出问题的。
另外我不推荐新手或者只是为了使用一两个软件要用到Python环境的同学安装anaconda,这货集成了诸多第三方包和其他功能,用不上,体积还大。
2. 安装第三方库
同样需要安装3个第三方库,分别是:PyQt5图形库,configparser库和PIL库和打包用的py2app,因为py2app在
pip3 install pyqt5
pi3 install configparser
pip3 install pillow
pip3 install pyinstaller
其中PyQt5安装的时候比较久,耐心等待。
3. 尝试运行
打开Mac的终端,cd到项目目录,输入:
python3 QiniuHelper.py
如果软件顺利打开,则说明可以进行打包操作了。
4. 进行打包
没有Windows打包时的骚操作,但是用py2app打开会比pyinstaller打包稍微复杂一点。
首先,是安装了py2app之后终端可以使用py2applet命令了:
py2applet --make-setup QiniuHelper.py
这一步完成之后会生成一个setup文件,然后:
python3 setup.py py2app -A --iconfile icon.icns
其中:
- py2app:打包用的工具
- -A:表示打包成一个启动入口程序,不采用完整打包方式
-
--iconfile icon.icns:为生成的程序指定一个图标,Mac下必须使用icns格式的图标文件,png/icon格式无法使用
好了,这是文件夹内也会多出一个build文件夹和一个dist文件夹,dist文件夹内有一个QiniuHelper.app,这是我们复制项目文件夹里的icon.png/icon.icns/on.png/off.png,右键QiniuHelper.app打开包含内容,把刚才复制的文件丢到Contents/Resource文件夹中。这时我们双击QiniuHelper.app,就能看到程序界面了。
因为生成的app是可以移动到任何地方的,所以尽管把它丢到应用程序里去吧,这样就可以在LaunchPad中看到它、并可以固定到Dock栏上了。
5. 后续
后续我也会把一键生成的脚本放到源码中,用户直接点击脚本一键生成就好。