减小pyinstaller可执行文件的大小

75

我有一个简单的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>\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyInstaller\hooks

在使用多个可执行文件时,一个可能的解决方案是将每个可执行文件链接到一个包含所有导入内容的单独文件夹或可执行文件。


1
如果您删除依赖项,exe 将无法运行您的脚本,或者我漏掉了什么? - Florent B.
2
@FlorentB。Pyinstaller正在打包其他不必要的东西。此外,那个exe文件有40mb?我尝试使用UPX压缩它,但对我来说没有太大变化。一定是我做错了什么。 - user9062171
当我运行 pyinstaller --onefile test.py (test.py 包含你的例子)时,我会得到一个大约 5MB 的可执行文件。 - John Anderson
4
尝试使用 --onedir 选项而非 --onefile,观察 PyInstaller 放置在 dist 文件夹中的内容。 - John Anderson
通常情况下,请检查您的依赖树。例如,numpy 可能正在使用 MKL,matplotlib 可能正在使用 Qt,这两者都可能导致非常大的可执行文件。请参见例如 https://stackoverflow.com/a/70113449、https://dev59.com/9KTja4cB1Zd3GeqPA2T9#67954011。 - djvg
5个回答

53

2
我有些犹豫,因为最近由于文件损坏问题和 Python,我不得不重新安装整个操作系统。这样做安全吗?我会在虚拟机中尝试一下看看情况如何。 - user9062171
5
是的,它有点像 Python 的虚拟环境。所有的软件包都安装在独立的虚拟环境中,并不会影响主 Python 安装。卸载只需要删除一个目录,你可以创建多个虚拟环境并安装不同组合的库和版本。 - Ophir Yoktan
1
这个方法在我的情况下节省了50%的文件大小。我正在导入 ospandassqlalchemy - mccbala
2
这个方法让我的exe从155 MB变成了10.4 MB。哈哈,谢谢。 - Amin Pial
1
我使用了一个干净的conda环境来运行我的可执行文件,这将可执行文件的大小从266 MB降低到12 MB。;) - Siddhant Sadangi
显示剩余4条评论

17

对我来说,使用pandas是一个简单的案例,但exe文件很大。

虽然删除某些目录有帮助,UPXING也很有帮助。

我把它减小了很多,这并不是默认设置。

话虽如此,最终和最重要的解决方案在这里讨论: 从指定位置导入Python模块。因此,有一个功能可以完成所有这些操作,但现在需要一些手动处理,因为:多包装束已经损坏了。

现在针对许多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。


5

Python解释器和所有已导入的模块都包含在可执行文件中。

您可以尝试将要排除的模块添加到spec文件中Analysis下的excludes列表中。

您还可以尝试使用UPX压缩可执行文件。请参见有关使用UPX的说明


2
默认情况下它不会使用UPX吗?我有很多要排除的模块,所以可能不是理想的选择。没有排除所有模块,除了给定目录的选项吗? - user9062171
1
我以为它会自动 upx,我错了。类似这样的命令:pyinstaller -F --upx-dir C:\Users\DD\Downloads\upx394w\upx394w\123\upx308w\upx.exe zz.spec 并不能起作用。 - user9062171

4
我曾经遇到过类似的问题,并找到了解决方案。我使用了Windows终端预览程序。该程序允许创建各种虚拟环境,如Windows Power Shell(顺便说一下,还有Linux Ubuntu。另外值得注意的是,您可以在此程序中安装许多终端,并且甚至可以同时打开几个。非常酷)。
在Windows终端预览中的Windows Power Shell中,我安装了所有必要的库,然后打开了我的文件路径并尝试使用以下命令: pyinstaller --onefile -w 'filename.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/,但在我看来,这个库对我来说非常困难。


0

我使用Anaconda环境,因此virtualenv解决方案不可行。 我的方法是在我的spec文件中排除不必要的模块,例如:

在Analysis(...)中

excludes=['pandas', 'numpy'],

这些模块会导致文件大小异常地增加。

对于每个构建,我都使用这个调整后的规格文件来创建可执行文件。

pyinstaller "mySpec.spec" --distpath="<path>"

1
你可以创建一个干净的新的conda环境。这将可执行文件大小从266 MB降至12 MB。 - Siddhant Sadangi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接