更新於 2024/08/25閱讀時間約 1 分鐘

Pyinstaller & Nuitka 打包瘦身筆記 [Kurt]



只打包scipy特定模組, import時要只import要的部份

然後打包時指定排除

#排除import以外的庫
pyinstaller --onefile --exclude-module=scipy.* --exclude-module=scipy.interpolate.* --exclude-module=scipy.signal.* your_script.py
#排除 NumPy 的 testing 和 f2py 模块,它们通常不需要打包。
pyinstaller --onefile --exclude-module=numpy.testing --exclude-module=numpy.f2py your_script.py
#排除 matplotlib 的测试模块,它们通常不是必需的
​pyinstaller --onefile --exclude-module=matplotlib.tests --exclude-module=matplotlib.testing your_script.py
#排除扩展功能在 mpl_toolkits 模块中,比如 mplot3d 和 basemap。
pyinstaller --onefile --exclude-module=mpl_toolkits.mplot3d --exclude-module=mpl_toolkits.basemap your_script.py

nuitka --onefile --nofollow-imports --include-module=scipy.interpolate --include-module=scipy.signal your_script.py
nuitka --onefile --nofollow-imports --include-module=numpy.core --include-module=numpy.linalg your_script.py


matplotlib 包含很多字体文件和样式文件,它们可能不必要。打包时可以选择性删除这些文件:

手动删除不必要的字体和样式文件:找到 matplotlib 的安装目录,然后进入 mpl-data/fonts 和 mpl-data/stylelib 文件夹,删除不需要的字体和样式文件。这样可以减少文件大小。

使用 PyInstaller 的 --add-data 和 --exclude-module 选项:可以控制添加和排除的数据。例如,仅添加所需的字体或样式文件:

pyinstaller --onefile --add-data "path/to/matplotlib/mpl-data/fonts;mpl-data/fonts" your_script.py


使用自定义 matplotlib 配置文件

matplotlib 使用一个配置文件(通常位于 ~/.matplotlib/matplotlibrc),这个文件控制 matplotlib 的默认行为。通过编辑这个文件,您可以指定默认字体、样式和不必要的功能,从而减少打包的大小。例如:

backend : Agg

==================================

Nuitka的使用

Nuitka 生成的包大小通常最小,啟動速度最快。支援 Windows、macOS 和 Linux。適合對性能有較高要求的應用。另外可以和pyinstaller配合,首先使用 Nuitka 编译,优化代码性能并减少不必要的 Python 解释器依赖,也可以混淆与保护,代码被转化为 C/C++ 代码并编译成机器码,这比简单的打包更难反编译。

nuitka --standalone --output-dir=dist example.py
cd dist
pyinstaller --onefile --add-data "./*:./" example.spec


單獨使用 Nuitka 编译 example.py 脚本,并生成一个可执行文件。以下是一些常用的 Nuitka 命令选项:

--standalone:生成独立的可执行文件,包含所有依赖项。

--onefile:将所有文件打包为单个可执行文件。

--enable-plugin=:启用某些插件(如 numpy、matplotlib 等),以优化支持特定的库。

--show-progress:显示编译进度。

执行以下命令来编译 Python 脚本:

pip install nuitka
nuitka --standalone --onefile --enable-plugin=numpy --enable-plugin=matplotlib example.py

调整 Nuitka 选项以优化输出

可以根据需要调整 Nuitka 的其他选项,以优化生成的可执行文件:


--lto(Link Time Optimization):启用链接时优化,可以进一步减小文件大小和提升性能。

--follow-imports:递归跟随所有导入,确保没有遗漏任何必要的模块。

--disable-console(Windows 专用):隐藏控制台窗口,适用于 GUI 应用程序。

例如,使用链接时优化和递归导入选项:

nuitka --standalone --onefile --lto --follow-imports example.py

如果打包的文件过大,您可以检查并排除不必要的模块。在 Nuitka 中,您可以使用 --nofollow-import-to 选项排除特定模块:

#排除 matplotlib.tests 模块(以及任何其他不需要的测试模块)
nuitka --standalone --onefile --nofollow-import-to=matplotlib.tests example.py


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.