PyQt Bloat和Pyinstaller

时间:2013-02-04 07:41:22

标签: python qt pyqt4 binaryfiles pyinstaller

我是Qt的新手,并且一直在使用Qt-Designer生成代码来与我在python中编写的程序进行交互。但是,当我想使用pyinstall将它们编译成二进制文件时,我得到的/dist/大小约为60 MB。使用--onefile选项时,我能够将其降低到大约20 mb。

我确定膨胀是由于Qt导入不必要的库造成的。任何人都可以指出我正确的方向减少这种惊人的臃肿?我很肯定,对于我正在编写的琐碎应用,20 mb是严重过剩的。谢谢您的帮助。

使用:Python 2.6.5,pyinstaller 2.0,Qt 4.6.2。,PyQt4

在dist中生成的文件列表:

    bz2.so
_codecs_cn.so
_codecs_hk.so
_codecs_iso2022.so
_codecs_jp.so
_codecs_kr.so
_codecs_tw.so
datetime.so
_heapq.so
libaudio.so.2
libbz2.so.1.0
libcrypto.so.0.9.8
libexpat.so.1
libfontconfig.so.1
libfreetype.so.6
libgcc_s.so.1
libGLcore.so.1
libglib-2.0.so.0
libgobject-2.0.so.0
libgthread-2.0.so.0
libICE.so.6
libjpeg.so.62
liblcms.so.1
libmng.so.1
libncurses.so.5
libncursesw.so.5
libnvidia-tls.so.1
libpcre.so.3
libpng12.so.0
libpython2.6.so.1.0
libQt3Support.so.4
libQtCore.so.4
libQtGui.so.4
libQtNetwork.so.4
libQtOpenGL.so.4
libQtSql.so.4
libQtSvg.so.4
libQtXml.so.4
libreadline.so.6
libSM.so.6
libssl.so.0.9.8
libstdc++.so.6
libtiff.so.4
libuuid.so.1
libX11.so.6
libXau.so.6
libxcb.so.1
libXdmcp.so.6
libXext.so.6
libXrender.so.1
libXt.so.6
libz.so.1
_multibytecodec.so
PyQt4.QtCore.so
PyQt4.QtGui.so
qt4_plugins
readline.so
sip.so

3 个答案:

答案 0 :(得分:4)

如果您要链接到Qt4,那么“膨胀”的数量是不可避免的,因为这些库是Qt4的依赖项。

为了验证这一点,您可以在库上使用ldd来查看其共享依赖项。尝试运行ldd libQtGui.so.4并查看它所依赖的库数量。然后对所有其他共享库执行相同的操作。

我个人不会过分担心可执行文件的大小。正如您所注意到的,它主要归结为Qt,这意味着随着应用程序的增长,生成的二进制文件的大小几乎不会发生变化。

答案 1 :(得分:2)

我们看到Hatchet,这是一个Github项目,用于分析应用程序中的依赖关系并重建PySide绑定以适应。

Qt5正在逐步减少依赖关系,将库分解为更小的库。也许一个pyinstalled PyQt5应用程序的膨胀较少。

即使你只导入你需要的模块,我也不确定Pyinstaller或Hatchet会做你似乎做过的事情,分析Python直接绑定的库是否依赖于Python不直接绑定的库

更糟糕的问题(对我而言)是Pyinstaller冻结了系统库,例如libxcb,它们与较新版本的OS上的其他库的新版本(它不会冻结)不兼容。例如,我的应用程序冻结在Ubuntu 13.04上崩溃了13.10和一个应用程序冻结了13.10崩溃在14.04beta。有解决方法。

答案 2 :(得分:1)

更好的是,我建立了CadentOrange对ldd的建议,并使用了命令ldd -u,它实际上打印了未使用的直接依赖关系。使用这种分析方法,我能够确定上面列出的大部分内容都是完全垃圾,并将列表修剪为可怜的5个文件。对于应用程序的单个目录部署,我能够将膨胀减少到~10 mb!希望能帮助其他可能遇到同样问题的人。