Kivy,Python:我无法减小 PyInstaller 生成的包的大小

Posted

技术标签:

【中文标题】Kivy,Python:我无法减小 PyInstaller 生成的包的大小【英文标题】:Kivy, Python: I cannot reduce the size of the package generated by PyInstaller 【发布时间】:2017-10-07 21:58:10 【问题描述】:

我使用 python 3 和 Kivy 编写了一个小应用程序。该应用程序基于 python 和 kv 文件。我想为 Windows 创建一个包。根据官方文档上的信息,我能够创建一个包,但它真的很大!然后我尝试减小包的大小,不包括未使用的库。为此,我再次遵循了官方文档。

这是我创建和修改的规范文件:

from kivy.deps import sdl2, glew
from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal,     hookspath
# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['C:\\Users\\..\\wecker'],             
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=hookspath(),
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             **get_deps_minimal(video=None, audio=None))
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='myweckapp',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe, Tree('buildtemp'),
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               name='myweckapp')

当我运行命令时:

python -m PyInstaller --name touchtracer examples-path\demo\touchtracer\main.py

我收到以下错误消息:

WARNING: stderr: TypeError: type object got multiplevalues for keyword argument 'excludes'

我无法继续。我试图消除代码行:

excludes=[],

然后我收到以下消息:

WARNING: stderr: TypeError: type object got multiplevalues for keyword argument 'hiddenimports'

因此,我也尝试消除这一行:

hiddenimports=[]

现在,我可以创建一个包,但它仍然很大!

知道我哪里错了吗?

【问题讨论】:

【参考方案1】:

它有多大?我之前使用 PyInstaller 也遇到过类似的大小问题。我有一些巨大的模块,如 IPython、cv2 等,PyInstaller 默认不排除它们。您可以运行以下代码来获取所有已安装和内置的 python 模块的列表:

import pkgutil
for i in pkgutil.iter_modules():
    print('"'+i[1]+'",')

这将为您提供所有已安装模块的列表。接下来,运行以下命令来制作 SPEC 文件:

pyi-makespec main.py

接下来,打开规范文件。在排除部分中,粘贴从上面的代码创建的列表。仅删除您需要的那些(您将需要删除几个内置函数)。看看这是否有帮助。

【讨论】:

抱歉这个问题......但我是新手。我必须在哪里编写您的代码“import pkgutil ...”? 我的意思是,您可以通过多种方式减少浪费,看起来您走在正确的轨道上。完整的文件大小是多少,如果您使用的是什么类型的媒体。将特定文件转换为不同类型可以减小整体大小,同时将质量损失降至最低(如果有的话)。同样重要的是要了解您实际上是在构建一个具有程序所有依赖项的静态应用程序。我已经在测试机器上为自己做了一些事情,我将 Python it's self 与 kivy 以及我测试所需的所有其他东西捆绑在一起。您能给我们提供更多信息吗? 你可以打开IDLE并输入它。IDLE是python的交互式shell。没问题,很乐意提供帮助。 亲爱的 Benjamin,获取我需要的模块列表和内置函数的最佳方法是什么。我正在打包一个 Kivy + Python 应用程序,大小约为 300MB!!!! :(

以上是关于Kivy,Python:我无法减小 PyInstaller 生成的包的大小的主要内容,如果未能解决你的问题,请参考以下文章

无法运行简单的程序 - Python - Kivy - Ubuntu

无法在 KIVY Python 中打印取自 kivy.uix.textinput.TextInput 的文本

无法在 Ubuntu Wily 上运行 Kivy

第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList

Kivy - 错误无法获得权限?

Python Kivy 无法从另一个类访问 id