当我们需要将Python代码打包成独立的可执行文件时,PyInstaller是一个非常好用的工具。它可以将Python脚本打包成Windows、Linux、MacOS等多平台的可执行文件,方便我们在不同的环境中使用。除了基本用法外,PyInstaller还有一些高级用法,本文将详细讲解这些高级用法并提供示例说明。
1.使用hook文件
在打包过程中,一些第三方库可能没有被正确识别,导致打包后的程序无法正常运行。为了解决这个问题,我们可以通过编写hook文件来手动指定这些库的位置和依赖关系。hook文件是一种类似配置文件的文件,需要存储在特定的hooks目录下。假设我们要打包的脚本中使用了Pillow库,但打包后程序无法正确识别,我们可以通过以下步骤使用hook文件解决问题。
- 在项目目录中创建hooks文件夹,并在其中创建Pillow库的hook文件(文件名为pillow hook-python.py)。
- 将以下代码添加到hook文件中
from PyInstaller.utils.hooks import copy_metadata, collect_data_files
datas = copy_metadata('Pillow')
datas += collect_data_files('Pillow')
- 运行打包命令,加上–additional-hooks-dir参数来指定hook文件所在的文件夹
pyinstaller --additional-hooks-dir=./hooks script.py
2.使用spec文件
打包时,PyInstaller会自动根据脚本中所引用的库和资源文件来构建打包命令。但是,如果我们想要手动指定打包命令,或者在构建时添加一些其他的操作,可以使用spec文件来实现。spec文件是一个Python脚本文件,负责控制打包过程中的各种操作。以下是一个使用spec文件打包的示例:
- 创建一个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',
)
- 运行以下命令打包:
pyinstaller script.spec
以上是关于Pyinstaller打包的高级用法的基本介绍,如果需要更加详细的讲解,请阅读官方文档。