pyinstaller打包详解Ⅱ

PyInstaller .spec 文件详解

什么是 .spec 文件?

.spec 文件是 PyInstaller 用来配置打包过程的文件。它是一个 Python 脚本,包含了关于你的 Python 脚本及其依赖的所有详细信息。通过编辑 .spec 文件,你可以更细致地控制打包过程,包括添加数据文件、排除不必要的依赖、设置图标等。

生成 .spec 文件

当你使用 PyInstaller 打包 Python 脚本时,可以通过以下命令生成一个 .spec 文件:

bash复制

pyinstaller your_script.py

这将在当前目录下生成一个 your_script.spec 文件。你也可以使用 pyi-makespec 工具来生成 .spec 文件:

bash复制

pyi-makespec your_script.py
.spec 文件的结构

一个典型的 .spec 文件包含以下几个部分:

  1. Analysis:

    • 分析脚本和依赖项。

    • 包括脚本路径、数据文件、隐藏导入、排除项等。

  2. PYZ:

    • 打包 Python 字节码。

  3. EXE:

    • 生成可执行文件的配置。

  4. COLLECT:

    • 收集所有文件并打包成一个文件夹或单个可执行文件。

以下是一个示例 .spec 文件:

Python复制

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    ['your_script.py'],
    pathex=['.'],
    binaries=[],
    datas=[('config.ini', '.')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=['numpy', 'pandas'],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='your_script',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=False,
    icon='icon.ico',
)

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='your_script',
)
配置 .spec 文件
  1. Analysis 参数:

    • scripts: 脚本列表,包含所有需要打包的 Python 脚本文件的路径。

      Python复制

      scripts=['your_script.py'],
    • pathex: 搜索模块的路径列表。

      Python复制

      pathex=['.'],
    • binaries: 需要包含的二进制文件列表。

      Python复制

      binaries=[],
    • datas: 需要包含的数据文件及其目标目录。

      Python复制

      datas=[('config.ini', '.')],
    • hiddenimports: 隐藏导入的模块列表。

      Python复制

      hiddenimports=[],
    • hookspath: 自定义挂钩(hooks)的路径列表。

      Python复制

      hookspath=[],
    • hooksconfig: 挂钩配置字典。

      Python复制

      hooksconfig={},
    • runtime_hooks: 运行时挂钩的路径列表。

      Python复制

      runtime_hooks=[],
    • excludes: 排除的模块列表。

      Python复制

      excludes=['numpy', 'pandas'],
    • win_no_prefer_redirects: Windows 平台特定选项,是否优先使用重定向。

      Python复制

      win_no_prefer_redirects=False,
    • win_private_assemblies: Windows 平台特定选项,是否使用私有程序集。

      Python复制

      win_private_assemblies=False,
    • cipher: 加密密钥。

      Python复制

      cipher=block_cipher,
    • noarchive: 是否将纯 Python 模块存储在归档文件中。

      Python复制

      noarchive=False,
  2. PYZ 参数:

    • pyz: 包含纯 Python 模块的归档文件。

      Python复制

      pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
  3. EXE 参数:

    • pyz: 包含纯 Python 模块的归档文件。

      Python复制

      pyz,
    • a.scripts: 脚本列表。

      Python复制

      a.scripts,
    • a.binaries: 二进制文件列表。

      Python复制

      a.binaries,
    • a.zipfiles: 压缩文件列表。

      Python复制

      a.zipfiles,
    • a.datas: 数据文件列表。

      Python复制

      a.datas,
    • name: 生成的可执行文件的名称。

      Python复制

      name='your_script',
    • debug: 是否启用调试模式。

      Python复制

      debug=False,
    • bootloader_ignore_signals: 是否忽略信号。

      Python复制

      bootloader_ignore_signals=False,
    • strip: 是否剥离可执行文件中的调试符号。

      Python复制

      strip=False,
    • upx: 是否使用 UPX 压缩可执行文件。

      Python复制

      upx=True,
    • console: 是否显示控制台窗口。

      Python复制

      console=False,
    • icon: 应用程序的图标文件。

      Python复制

      icon='icon.ico',
  4. COLLECT 参数:

    • exe: 生成的可执行文件。

      Python复制

      exe,
    • a.binaries: 二进制文件列表。

      Python复制

      a.binaries,
    • a.zipfiles: 压缩文件列表。

      Python复制

      a.zipfiles,
    • a.datas: 数据文件列表。

      Python复制

      a.datas,
    • strip: 是否剥离可执行文件中的调试符号。

      Python复制

      strip=False,
    • upx: 是否使用 UPX 压缩可执行文件。

      Python复制

      upx=True,
    • upx_exclude: 不使用 UPX 压缩的文件列表。

      Python复制

      upx_exclude=[],
    • name: 生成的文件夹或可执行文件的名称。

      Python复制

      name='your_script',
示例

假设你有一个简单的 Python 脚本 hello.py,内容如下:

Python复制

def main():
    print("Hello, PyInstaller!")

if __name__ == "__main__":
    main()
  1. 生成 .spec 文件:

    bash复制

    pyinstaller --onefile hello.py

    这将在当前目录下生成 hello.spec 文件。

  2. 编辑 .spec 文件: 打开 hello.spec 文件,添加数据文件和排除不必要的依赖:

    Python复制

    a = Analysis(
        ['hello.py'],
        pathex=['.'],
        binaries=[],
        datas=[('config.ini', '.')],
        hiddenimports=[],
        hookspath=[],
        hooksconfig={},
        runtime_hooks=[],
        excludes=['numpy', 'pandas'],
        win_no_prefer_redirects=False,
        win_private_assemblies=False,
        cipher=block_cipher,
        noarchive=False,
    )
  3. 打包: 使用编辑后的 .spec 文件进行打包:

    bash复制

    pyinstaller hello.spec

    这将生成一个包含 hello.exedist 文件夹。

通过以上步骤,你可以更细致地控制 PyInstaller 的打包过程,确保生成的可执行文件符合你的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值