减少pyinstaller exe的大小

27 python selenium pyinstaller pandas selenium-webdriver

我有一个简单的pandas pyinstaller exe,超过40MB.

我的exe示例:

import collections
import csv
import selenium
import pandas

print('hi')
Run Code Online (Sandbox Code Playgroud)

40MB +这似乎有点矫枉过正.

我怎样才能尽可能减少这个?

一种方法:

pyinstaller --onefile --exclude matplotlib --exclude scipy --exclude pandas --exclude numpy.py
Run Code Online (Sandbox Code Playgroud)

然而,考虑到排除列表的大小,这是不切实际的.

如何为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 )
Run Code Online (Sandbox Code Playgroud)

这也值得一提.默认情况下,Pyinstaller不会检测到pandas.

加:

hiddenimports = ['pandas._libs.tslibs.timedeltas']

To: C:\Users\<NAME>\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyInstaller\hooks
Run Code Online (Sandbox Code Playgroud)

使用多个可执行文件时可能的解决方案是将每个可执行文件链接到单独的文件夹或可执行文件以及所有导入.

Oph*_*tan 14

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

有关使用虚拟环境的一些详细信息,请访问:https://virtualenv.pypa.io/en/stable/

  • 是的 - 它有点像python虚拟框 - 所有软件包都安装在一个单独的虚拟环境中,并且不影响主要的python安装.删除它只是删除一个目录,你可以使用不同的库和版本组合的sevral virtualenvs (3认同)
  • 我对此犹豫不决,因为最近由于文件损坏问题和 python,我不得不重新安装整个操作系统。这安全吗?我将看看这在虚拟盒子中是如何进行的。 (2认同)
  • 这种方法实际上使我的 exe 从 155 MB 变成了 10.4 MB。哈哈谢谢。 (2认同)

小智 9

我觉得这两个答案都很棒.

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

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

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

话虽如此,这里讨论了最终和最重要的解决方案:从选定位置导入Python模块.所以有一个功能完成了所有这些,但是现在涉及一些手动处理因为:multipackage-bundle被打破了.

现在到了许多exe的简单解决方案

如果您有许多可执行文件,我强烈推荐这种方法:

pyinstaller -F abc.py --onedir (Have all imports of both scripts)
pyinstaller -F abd.py --onedir (Have all imports of both scripts)
Run Code Online (Sandbox Code Playgroud)

现在将abd.exe放在abc.py文件夹的一个目录以及任何其他外部脚本中.确保它们的名称不同或只运行一个脚本.

这非常有效,因为所有依赖项都在一个文件夹中.这应该是这样的.所以在这个例子中说你有一个40mb的文件夹.对于之后的每个额外的exe,它将只是+ 5mb(或exe的大小)而不是每个40mb.


小智 5

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

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

您还可以尝试使用 UPX 压缩可执行文件。请参阅使用 UPX 的注意事项

  • 默认情况下不upx吗?我有大量模块需要排除,所以可能不理想。没有排除除给定目录之外的所有模块? (2认同)