我有一个简单的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
使用多个可执行文件时可能solution可能是将每个可执行文件链接到单独的文件夹或可执行文件以及所有导入文件。
答案 0 :(得分:10)
尝试使用virtualenv设置您的环境,并在那里只安装所需的库
有关使用虚拟环境的一些详细信息,请访问:https://virtualenv.pypa.io/en/stable/
答案 1 :(得分:6)
我觉得这两个答案都很棒。
对我来说,使用pandas的一个简单例子就是exe很大。
虽然删除某些目录很有帮助,但UPXING也有很大帮助。
我减少了很多,默认情况下没有这样做。
话虽如此,最终和最重要的解决方案在这里讨论:Importing Python modules from a select location。所以有一个功能可以做到这一切,但是现在有一些手动处理因为: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)
现在将abd.exe放在abc.py文件夹的一个目录以及任何其他外部脚本中。确保它们的名称不同,或者只运行一个脚本。
这非常有效,因为所有依赖项都在一个文件夹中。这应该是这样的。所以在这个例子中说你有一个40mb的文件夹。对于之后的每个额外的exe,它将只是+ 5mb(或exe的大小)而不是每个40mb。
答案 2 :(得分:0)
python解释器和所有导入的模块都包含在可执行文件中。
您可以尝试将要排除的模块添加到规范文件中excludes
下的Analysis
列表中。
您也可以尝试使用UPX压缩可执行文件。见A note on using UPX
答案 3 :(得分:0)
我使用的是Anaconda环境,因此无法选择virtualenv解决方案。 我的方法是在规范文件中排除不必要的模块,例如:
在Analysis(...)
backupNumber
(这是模块,它们会特别增加文件的大小)
对于每个版本,我都使用此经过调整的规范文件来创建exe。
excludes=['pandas', 'numpy'],