前言
PyInstaller 可以将 Python 程序打包为独立的可执行文件,不需要用户手动安装 Python 和相关依赖。这使得分发和部署变得更加简单,方便将 Python 程序交付给其他用户或客户。
目录
安装
pip install pyinstaller
相关参数
-F
或--onefile
:生成单个独立的可执行文件而不是一个文件夹,这对于分发和部署来说更方便。
-w
或--windowed
:在 Windows 上生成一个没有控制台窗口的可执行文件,适用于 GUI 应用程序。
-c
或--console
:在 Windows 上生成一个带有控制台窗口的可执行文件,适用于命令行应用程序。
-n NAME
或--name=NAME
:指定生成的可执行文件的名称。
-i ICON
或--icon=ICON
:指定可执行文件的图标文件。
--add-data "SRC;DEST"
:将额外的非 Python 文件(例如配置文件、数据文件等)复制到可执行文件的目录下。
--add-binary "SRC;DEST"
:将二进制文件(例如 DLL 文件)复制到可执行文件的目录下。
--hidden-import MODULE
:手动添加导入的模块,以确保它们被正确地包含在可执行文件中。
--exclude MODULE
:排除特定的模块以减小可执行文件的大小。
--upx
:使用 UPX 压缩可执行文件,这可以减小文件的大小。
使用样例
简单使用
pyinstaller xxx.py
进阶使用
pyinstaller -Fw D:\my_Script.py -i D:\my.ico --distpath D:\dist_tool --name my_Tool --upx-dir D:\dist_tool\upx-4.0.2-win64
高阶使用
修改spec文件,使用spec进行打包.
pyinstaller -Fw D:\my_Script.spec
问题和解决方法
一般常见问题
- 打包后的程序无法运行
- 打包后的程序体积较大
- 打包后的程序出现兼容性问题
- 打包后的程序出现运行效率等问题
- 打包后的程序出现安全问题
解决办法
程序闪退
文件路径和相对路径:由于 PyInstaller 将所有文件打包成单个可执行文件,因此文件路径和相对路径可能会发生变化。确保你的程序中使用了相对路径或动态获取文件路径的方法,以避免在打包后无法找到文件的问题。
依赖管理:PyInstaller 会尝试自动检测和打包程序所依赖的库和资源文件,但有些情况下可能会出现依赖管理的问题。确保你在打包前已经安装了所有程序所需的依赖,并且这些依赖对于 PyInstaller 是可访问的。如果遇到依赖未被正确打包或加载的问题,可以考虑手动添加依赖项。
体积过大
- 针对该项目用到的依赖库,单独配置一套打包用的极简环境.
- 使用--upx参数,在引进压缩工具的帮助下,减少打包程序的体积;
特殊问题
应用pywin32模块
问题出在pyinstaller包不能正常找到pywin32模块的位置
需要在目录 Lib\site-packages\PyInstaller\hooks手动创建添加一个文件
hook-win32api.py
hook-win32api.py内容如下
from PyInstaller.utils.hooks import collect_submodules
hiddenimports = collect_submodules('win32com')
应用多进程方法
如果 Python 解释器被打包成可执行文件(例如使用 PyInstaller、py2exe 等工具),子进程的启动方式会与普通的 Python 脚本运行方式稍有不同。
freeze_support()
函数的作用是检查当前脚本是否正在被打包成可执行文件,如果是,则执行一些必要的初始化操作,使子进程能够正常工作。如果没有调用 freeze_support()
函数,可能会导致子进程无法正确启动或运行。(避免子进程重复启动)
import multiprocessing
def worker():
print('This is a worker process')
if __name__ == '__main__':
multiprocessing.freeze_support() # 调用 freeze_support() 函数
p = multiprocessing.Process(target=worker)
p.start()
p.join()
pyecharts应用
内容
需要将pyecharts应用于独立GUI软件/CS架构开发
spec文件
a = Analysis(['main.py'],
pathex=['.\\'],
binaries=[],
datas=[('.\\resource\\datasets', 'pyecharts\\datasets\\.'),
('.\\resource\\templates', 'pyecharts\\render\\templates\\.')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
处理流程
- 创建
resources
文件夹 pyecharts资源文件datasets
及templates
整合至特定目录下(如打包目录下./resources
文件夹)- 修改Spec文件 已有pyinstaller生成的
.spec
文件(每次执行pyinstaller都会生成一个spec文件)修改datas
字段(元组中左侧元素为资源文件路径,右侧是打包后相对于临时文件夹路径拷贝位置)- 执行打包 指令pyinstaller main.spec -Fw
注意:spec文件最好和
resources文件夹在同一层级,方便找到.
参考链接 pyecharts官方地址https://pyecharts.org/#/zh-cn/pyinstaller_pack