减小 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/ 但在我看来,这个库非常难,至少对我来说是这样。
我有一个简单的 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
当使用多个可执行文件时,可能
尝试使用 virtualenv 设置您的环境,并只在其中安装所需的库
这里有一些关于使用虚拟环境的细节:https://virtualenv.pypa.io/en/stable/
python 解释器和所有导入的模块都包含在可执行文件中。
您可以尝试将要排除的模块添加到规范文件中 Analysis
下的 excludes
列表中。
您也可以尝试使用 UPX 压缩可执行文件。参见 A note on using UPX
对我来说,使用pandas就是一个简单的例子,exe很大。
虽然删除某些目录很有帮助,但 UPXING 也有很大帮助。
我把它减少了很多,默认情况下它没有这样做。
话虽如此,这里讨论的是最终也是最重要的解决方案:
现在是大量 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/ 但在我看来,这个库非常难,至少对我来说是这样。