1、pyinstaller

pyinstaller

在创建了独立应用(自包含该应用的依赖包)之后,还可以使用 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选项)的可执行文件。

Options

参数名 描述 示例 类型 必须 默认值
--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)

spec

打包过程中,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"