将python程序打包成可执行的文件

作为一种解释型语言而非编译型语言,python并不像C++那样可以直接生成可执行文件。 这意味着一个python程序想在另一台电脑上跑就必须在另一台电脑装python解释器。但生活经验告诉你,你用的应用都有可执行文件(windows中是exe),它们当中大概率有python编译的部分,但它们为什么可以有可执行文件? 事实上,python也不是完全不能有可执行文件,但是要通过工具打包,PyInstaller就是一种方法。 PyInstaller 是一个将 Python 脚本打包为独立可执行文件的工具,支持 Windows、macOS 和 Linux 系统。以下是使用 PyInstaller 的步骤:

安装 PyInstaller

在终端输入命令:

pip install pyinstaller

打包 Python 脚本

假设你有一个 Python 文件 app.py,在解释器里你通过运行它来运行整个项目,你可以通过以下方法打包它: ## 直接打包

pyinstaller app.py
然后你会看到,PyInstaller 会生成一个 dist 目录,其中包含一个 app 文件夹,这个文件夹内就是打包后的可执行文件。此外,还会生成 build 目录(构建过程中的临时文件)和 .spec 文件(配置文件)。 ## 生成单个可执行文件
pyinstaller --onefile app.py
这样一来,dist 目录下就只有app的可执行文件了,没有了其他的依赖项,但是这样一来,可执行文件的大小会比原来大很多,之前的依赖项、解释器、第三方库都被打包进了可执行文件。 ## 指定图标
pyinstaller --onefile --icon=myicon.ico app.py
myicon.ico是你的图标文件,它最好和app.py放在同一级目录,ico文件可以用图片文件在aconvert自行制作。 指定图标之后,你的可执行文件的图标就不再是 这样的默认可执行文件图标了

不显示控制台窗口(适用于 GUI 应用程序)

pyinstaller --onefile --windowed app.py

这样一来,启动可执行文件就不会启动终端了。 ## 打包外部资源(如图片、音频等)

# Windows
pyinstaller --add-data "path_to_file;target_folder" app.py
# macOS/Linux
pyinstaller --add-data "path_to_file:target_folder" app.py
比如你的文件结构长这样:
project_folder/
│
├── app.py                        # 主程序
├── resources/                    # 顶层文件夹
│   ├── images/
│   │   └── assets/
│   │       └── logo.png          # 需要打包的图片文件
│   └── config/
│       └── config.yaml           # 需要打包的配置文件
此时,logo.png 被放在 resources/images/assets/ 文件夹下,而 config.yaml 位于 resources/config/ 文件夹中。 那么,此时,windows命令就是:
pyinstaller --onefile \
    --add-data "resources/config/config.yaml;resources/config" \
    --add-data "resources/images/assets/logo.png;resources/images/assets" app.py

生成后的文件

打包完成后,你会在 dist 文件夹中找到打包好的可执行文件。 如果你使用了 –onefile 选项,它会生成一个独立的 .exe 文件(Windows)或其他可执行文件。 如果没有使用 –onefile,则会生成一个包含多个文件的目录。

使用 .spec 文件

PyInstaller 会生成一个 .spec 文件,其中保存了打包时的配置信息。如果你想修改打包过程中的某些细节,可以编辑这个 .spec 文件,然后使用以下命令重新打包:

pyinstaller app.spec

其他

上述打包 Python 脚本的各种选项可以叠加,比如假设你想要打包一个 GUI 程序,并生成一个单独的可执行文件,同时使用自定义图标,可以运行:

pyinstaller --onefile --windowed --icon=myicon.ico app.py