在创建了独立应用(自包含该应用的依赖包)之后,还可以使用 PyInstaller 将 Python程序生成可直接运行的程序,这个程序就可以被分发到对应的 Windows、Linux或 Mac OS 平台上运行。
Python 默认并不包含 PyInstaller 模块,因此需要自行安装 PyInstaller 模块。
pip install pyinstaller
注意:建议使用 pip 在线安装的方式来安装 PyInstaller 模块,不要使用离线包的方式来安装,因为 PyInstaller 模块还依赖其他模块,pip 在安装 PyInstaller 模块时会先安装它的依赖模块。
在项目目录下,使用PyInstaller命令来打包您的Python脚本。假设您的主程序文件名为main.py
,则可以使用以下命令
pyinstaller --onefile main.py
这里的--onefile
选项指示PyInstaller生成一个单独的可执行文件,而不是一个包含多个文件的文件夹。PyInstaller还支持许多其他选项,如--icon
来指定应用程序的图标,--windowed
或--noconsole
来避免在Windows上打开命令行窗口等。
PyInstaller完成打包后,会在dist
目录下生成可执行文件(或文件夹,如果您没有使用--onefile
选项)。进入dist
目录,您应该能看到一个名为main
(或您指定的名称,如果使用了--name
选项)的可执行文件。
参数名 | 描述 | 示例 | 类型 | 必须 | 默认值 |
---|---|---|---|---|---|
--onefile |
将所有依赖文件打包为单个可执行文件。 | pyinstaller --onefile example.py |
bool |
否 | False |
--noconsole |
隐藏控制台窗口(适用于 GUI 应用)。 | pyinstaller --noconsole gui_app.py |
bool |
否 | False |
--name |
指定生成的可执行文件名称。 | pyinstaller --name=my_app example.py |
str |
否 | 源文件名(无扩展) |
--icon |
设置可执行文件的图标(需提供 .ico 文件)。 |
pyinstaller --icon=app_icon.ico example.py |
str |
否 | None |
--add-data |
捆绑额外文件(如配置文件、静态资源等)。 | pyinstaller --add-data "config.yaml;." example.py |
str |
否 | None |
--clean |
清理之前的构建缓存,强制重新打包。 | pyinstaller --clean example.py |
bool |
否 | False |
--hidden-import |
手动添加隐藏的依赖模块(通常是自动检测遗漏的依赖)。 | pyinstaller --hidden-import=requests example.py |
list |
否 | 自动检测 |
--windowed |
GUI 应用打包 | pyinstaller --windowed example.py |
bool |
否 | False |
例如将配置文件 config.yaml
一起捆绑进可执行文件
pyinstaller --onefile --add-data "config.yaml;." example_script.py
格式为:"源路径;目标路径"
,目标路径使用.
表示与exe同级目录。
注意:在 Windows 系统中,路径分隔符用分号 ;
,而在 macOS/Linux 中使用冒号 :
。
打包后资源文件会被解压到临时目录,直接使用原始路径将导致错误!需通过以下方法获取正确路径
import sys
import os
def resource_path(relative_path):
""" 获取资源的绝对路径 """
if hasattr(sys, '_MEIPASS'):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
# 示例:加载图片
img_path = resource_path("1.jpg")
image = pygame.image.load(img_path)
# 示例:加载字体
font_path = resource_path("HarmonyOS_Sans_SC_Black.ttf")
font = pygame.font.Font(font_path, 24)
打包过程中,PyInstaller 会生成一个 .spec
文件。这个文件包含了 PyInstaller 的配置信息,其中包含了构建过程的所有配置信息。你可以修改这个文件来定制打包过程。
# main.spec
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['/path/to/your/script'], # 项目的路径
binaries=[],
datas=[('data/*.txt', 'data')], # 资源文件
hiddenimports=['some_module'], # 隐藏导入模块
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='main',
debug=False,
strip=False,
upx=True,
console=False) # 设置是否显示控制台
一般情况下,我们的.spec文件会比这个更多的内容,虽然原则上.spec文件支持跨平台的配置,不过我们在实际中往往根据不同的平台配置特定的.spec文件。
你可以手动修改 .spec
文件来添加资源文件、修改导入模块、定制输出路径等。
你可以通过编辑.spec
文件,在EXE、COLLECT和BUNDLE块下添加一个name=
,为PyInstaller提供一个更好的名字,以便为应用程序(和dist
文件夹)使用。
EXE下的名字是可执行文件的名字,BUNDLE下的名字是应用程序包的名字。
修改完成后,执行以下命令来重新打包:
.spec
文件本身可以编写python的代码的,例如对于不同平台的图标处理
import sys
import os
from pathlib import Path
if sys.platform == "win32":
icon = "app/images/app.ico"
elif sys.platform == "darwin":
icon = "app/images/app.icns"