减少 pyinstaller exe 的大小
- 2025-03-05 09:16:00
- admin 原创
- 90
问题描述:
我有一个简单的 pandas pyinstaller exe,它超过 40MB。
我的 exe 示例:
import collections
import csv
import selenium
import pandas
print('hi')
40MB+似乎有点过分了。
我怎样才能尽可能减少这种情况?
一种方法:
pyinstaller --onefile --exclude matplotlib --exclude scipy --exclude pandas --exclude numpy.py
然而,考虑到排除名单有多大,这是不切实际的。
我如何选择一个文件夹让 pyinstaller 从中获取模块并排除其他所有内容,以便我可以拥有一个小应用程序?
规格文件:
a = Analysis(['123.py'],
pathex=['C:\\Users\\AA\\ZZ'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='123',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
还值得一提的是,默认情况下,Pyinstaller 不会检测 pandas。
添加:
hiddenimports = ['pandas._libs.tslibs.timedeltas']
To: C:Users<NAME>AppDataLocalProgramsPythonPython36Libsite-packagesPyInstallerhooks
使用多个可执行文件时的一个可能的解决方案是将每个可执行文件链接到单独的文件夹或包含所有导入的可执行文件。
解决方案 1:
尝试使用虚拟环境设置您的环境,并在其中仅安装所需的库
有关使用虚拟环境的一些详细信息如下:https://virtualenv.pypa.io/en/stable/
解决方案 2:
对我来说,这是一个使用 pandas 的简单案例,但 exe 文件非常大。
虽然删除某些目录很有帮助,但 UPXING 也有很大帮助。
我已经将它减少了很多,并且默认情况下它并没有这样做。
话虽如此,这里讨论的是最终和最重要的解决方案:从选定位置导入 Python 模块。因此有一个功能可以完成所有这些工作,但目前需要进行一些手动处理,因为:multipackage-bundles 已损坏。
现在来谈谈许多 exe 的简单解决方案
如果您有许多可执行文件,我强烈建议您采用这种方法:
pyinstaller -F abc.py --onedir (Have all imports of both scripts)
pyinstaller -F abd.py --onedir (Have all imports of both scripts)
现在将 abd.exe 和其他外部脚本一起放入 abc.py 文件夹的一个目录中。确保它们的名称不同,否则只有一个脚本会运行。
这确实很有效,因为所有依赖项都在一个文件夹中。这才是应该的。所以在这个例子中,假设你有一个 40mb 的文件夹。之后每个额外的 exe,它只会增加 5mb(或 exe 的大小),而不是每个 40mb。
解决方案 3:
可执行文件中包括 Python 解释器和所有导入的模块。
您可以尝试将您想要排除的模块添加到spec 文件的excludes
列表中。Analysis
您也可以尝试使用 UPX 压缩可执行文件。请参阅使用 UPX 的注意事项
解决方案 4:
我遇到了类似的问题,并找到了解决方案。我使用了 Windows 终端预览。该程序允许创建各种虚拟环境,如 Windows Power Shell(顺便说一下,还有 Linux Ubuntu。另外,值得注意的是:您可以在此程序中安装多个终端,甚至可以一次打开几个终端。非常酷的东西)。
在 Windows 终端预览版的 Windows Power Shell 中,我安装了所有必要的库,然后打开了我的文件路径并尝试使用此命令:
pyinstaller --onefile -w '文件名.py'
...但是,输出exe
不起作用。出于某种原因,控制台显示缺少一个库(我之前已经安装过)。我在模拟auto-py-to-exe
库中找到了解决方案。此 GUI 使用的命令是:
pyinstaller --noconfirm --onedir --console "C:/Users/something/filename.py"
这个效果很好。我将输出 exe 程序的大小从 911MB 减小到了 82.9MB !
顺便说一句。 的输出大小为 911MB auto-py-to-exe
。
我想知道为什么还没有人创建过一个可以读取代码、检查哪些库是代码的一部分、然后只将它们放入压缩包中的压缩器。就我而言,auto-py-to-exe
可能加载了我安装的所有库。这可以解释这个压缩文件夹的大小。
有人建议使用https://virtualenv.pypa.io/en/stable/但在我看来,这个库非常难,至少对我来说是这样。
解决方案 5:
对我来说,最重要的改进是不再使用 conda,而是使用 pip 安装所有必要的模块。这使许多项目中的可执行文件的大小减少了 10 倍。
解决方案 6:
使用较旧的 Python 版本:
* 切换到较旧的 Python 版本可以显著减小大小。例如,从 Python 3.12.5 迁移到 Python 3.8.10 可将我的程序大小从 29.56 MB 减小到 18.12 MB。
使用虚拟环境:
* 设置虚拟环境并仅安装所需的库:
# Windows
py -m venv .venv
.venvScriptsactivate
# Linux/macOS
python3 -m venv .venv
source .venv/bin/activate
使用UPX压缩:
* UPX 可以压缩您的可执行文件。安装 UPX 并将其与 PyInstaller 一起使用:
pyinstaller --upx-dir=/path/to/upx
最小化 PyInstaller 的内部文件(高级):
* PyInstaller 包含一些您可能不需要的额外内部文件。您可以手动删除或排除这些文件以节省空间,但请注意,如果操作不当,可能会导致您的构建不稳定。
希望这有帮助:)
扫码咨询,免费领取项目管理大礼包!