减小 pyinstaller exe 的大小

Reducing size of pyinstaller exe

我有一个简单的 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

然而,考虑到排除列表有多大,这是不切实际的。

如何 select 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

当使用多个可执行文件时,可能 link 每个可执行文件到一个单独的文件夹或可执行文件与所有导入。

尝试使用 virtualenv 设置您的环境,并只在其中安装所需的库

这里有一些关于使用虚拟环境的细节:https://virtualenv.pypa.io/en/stable/

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

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

您也可以尝试使用 UPX 压缩可执行文件。参见 A note on using UPX

对我来说,使用pandas就是一个简单的例子,exe很大。

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

我把它减少了很多,默认情况下它没有这样做。

话虽如此,这里讨论的是最终也是最重要的解决方案:。所以有一个功能可以完成所有这一切,但现在涉及一些手动处理,因为: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。

我使用 Anaconda 环境,因此 virtualenv 解决方案不是一个选项。 我的方法是在我的规范文件中排除不必要的模块,例如:

在分析中(...)

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

(这些模块极大地增加了文件的大小)

对于每个构建,我都使用这个调整后的规范文件来创建 exe。

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

我遇到了类似的问题并找到了解决方案。我使用 Windows 终端预览。该程序允许创建各种虚拟环境,例如 Windows Power Shell(顺便说一句。Linux Ubuntu 也一样。另外,值得注意的是:您可以在该程序中安装许多终端,并且,甚至,一次打开几个。很酷的东西)。

Inside Windows Power Shell in Windows terminal preview 我安装了所有必要的库,然后我打开我的文件的路径并尝试使用这个命令:

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/ 但在我看来,这个库非常难,至少对我来说是这样。