一、背景

区别于 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

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: 如何通过参数来控制应用?

  1. Python 脚本中调用外部文件的变量实现,实际运用时修改外部文件的内容即可;
  2. 更优雅的方法:用 Gui 开发工具实现,如简易便捷的 pysimplegui