一、背景
区别于 Cpp 等编程语言,Python 无法将其脚本直接转为可执行的文件。
「可执行文件」常见如:
- Win 下后缀为 exe 的文件
- Mac 下后缀为 app 的文件
在对应环境执行 Python 脚本,需要对应环境也同样有 Python 环境。这样在我们想给业务人员提供自动化的数据处理脚本 或 给女盆友绘制一棵圣诞树时,就会有产生一个困境:业务人员 / 女盆友 的电脑没有 Python 环境,即便装了对应的环境,后续的维护也较为麻烦。
既然无法直接转为可执行文件,那是否可以借助其他方法迂回地实现脚本的封装呢?答案是肯定的。
本文将从实现方法、具体内容、常见问题(如打包后的文件过大;Mac上无法打开文件等)3 个模块进行阐述。
二、实现
2.1 实现方法
最通用且方便的是,借助第三方库将对应 Python 脚本以及环境统一打包、封装。
这里强推 Pyinstaller ,在 Win 和 Mac 下都有很好的表现。
打包 Python 脚本的常用第三方库:
- Win 环境: Pyinstaller / Py2exe
- Mac 环境:Pyinstaller / Py2app (踩过巨坑,亲测不算好用)
- Pyinstaller 安装方法:
pip install pyinstaller
- Pyinstaller 的应用及参数说明:官方文档
2.2 具体内容
恰逢圣诞节,就用「绘制圣诞树」的脚本来举个栗子吧:
Step 1: 首先,打开 终端 (Terminal),通过 cd
命令进入圣诞树代码脚本所在的目录下:
cd <所在路径>
Step 2: 使用 Pyinstaller 库封装脚本:
继续在终端依次执行下述命令:
pyinstaller -F -w -i <app 文件的图标文件名>.icns --clean --noconfirm <Python脚本名称>.py
pyinstaller -F -w --clean --noconfirm <Python脚本名称>.spec
- -i 参数是指定可执行文件的图标,可不指定;
- 若进行指定,Win下支持 ico 格式的文件,Mac 下支持 icns 格式的文件;
- 可通过在线的图片格式转换网站,将 png 等格式的图片转为需要的 ico / icns 的文件
Step 3: 结果验收:
生成的可执行文件会保留在代码脚本所在的目录下的 dist
文件夹下,Win 环境下是 .exe 文件,Mac 环境下是 .app 文件,双击即可运行。
将对应文件拷贝出来发给需要的人即可,不需要对方装有 Python 环境。
下图是结果的展示:
- 图标
- 绘制后的成图:
2.3 常见问题 Q&A
Q1: 封装后的文件过大怎么办?
- 原因:由于 Pyinstaller 默认将当前整个 Python 环境 和 脚本内容封装进去的,因此在 Python 环境中第三方库越多,打包后的可执行文件越大;
- 解决方案:创建虚拟环境,进入(activate)虚拟环境后 pip 安装脚本需要用到的库,然后再用 Pyinstaller 封装脚本即可。
conda create -n <虚拟环境名称> python=<Python的版本>
conda activate <虚拟环境名称>
Q2: Mac 下无法打开文件?
- 原因:双击 app 文件后显示“应用程序 无法打开”的弹窗,在大多情况下,都是因为对应文件没有执行权限;
- 解决方案:在终端用 chmod 命令赋权限。
chmod +x <文件完整目录>
Q3: 如何通过参数来控制应用?
- Python 脚本中调用外部文件的变量实现,实际运用时修改外部文件的内容即可;
- 更优雅的方法:用 Gui 开发工具实现,如简易便捷的 pysimplegui。