总结Pyinstaller打包的高级用法

  • Post category:Python

当我们需要将Python代码打包成独立的可执行文件时,PyInstaller是一个非常好用的工具。它可以将Python脚本打包成Windows、Linux、MacOS等多平台的可执行文件,方便我们在不同的环境中使用。除了基本用法外,PyInstaller还有一些高级用法,本文将详细讲解这些高级用法并提供示例说明。

1.使用hook文件

在打包过程中,一些第三方库可能没有被正确识别,导致打包后的程序无法正常运行。为了解决这个问题,我们可以通过编写hook文件来手动指定这些库的位置和依赖关系。hook文件是一种类似配置文件的文件,需要存储在特定的hooks目录下。假设我们要打包的脚本中使用了Pillow库,但打包后程序无法正确识别,我们可以通过以下步骤使用hook文件解决问题。

  1. 在项目目录中创建hooks文件夹,并在其中创建Pillow库的hook文件(文件名为pillow hook-python.py)。
  2. 将以下代码添加到hook文件中
from PyInstaller.utils.hooks import copy_metadata, collect_data_files

datas = copy_metadata('Pillow')
datas += collect_data_files('Pillow')

  1. 运行打包命令,加上–additional-hooks-dir参数来指定hook文件所在的文件夹
pyinstaller --additional-hooks-dir=./hooks script.py

2.使用spec文件

打包时,PyInstaller会自动根据脚本中所引用的库和资源文件来构建打包命令。但是,如果我们想要手动指定打包命令,或者在构建时添加一些其他的操作,可以使用spec文件来实现。spec文件是一个Python脚本文件,负责控制打包过程中的各种操作。以下是一个使用spec文件打包的示例:

  1. 创建一个spec文件(文件名为script.spec),并将以下代码添加到文件中
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['script.py'],
             pathex=['/path/to/your/script'],
             binaries=[],
             datas=[('/path/to/your/images', 'images')],
             hiddenimports=['Pillow'],
             hookspath=['./hooks'],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

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

# The commented out COLLECT block is an alternative usage of COLLECT to the one specified above.
# Traps can be pass to a list (ex: traps=["some.InterrestingException"]).
# COLLECT data files of PKG-NAME package to PKG-NAME directory
# osx=(["somefile"], ["dirB/dirC/somefile"]) # data-files pair
# mlx,pyd=('data/path1', 'PKG-NAME') # data-dir package-dir pairs
# COLLECT data directories of data_dirs list to DATA subdirectory of PKG-NAME directory
# data_dirs=('data/dirA', 'data/dirB') # list of directories
# COLLECT data files or pairs of PKG-NAME package to COLLECT-NAME directory
# binary_pkg=[('iconwin.foo', 'PKG-NAME') , 'other.pk']
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='script',
          debug=False,
          bootloader_ignore_signals=True,
          strip=False,
          upx=True,
          upx_exclude=[],
          upx_include=[],
          console=True )
coll = COLLECT(exe,
            a.binaries,
            a.zipfiles,
            a.datas,
            [],
            name='script',
            )
  1. 运行以下命令打包:
pyinstaller script.spec

以上是关于Pyinstaller打包的高级用法的基本介绍,如果需要更加详细的讲解,请阅读官方文档。