PyQt臃肿与Pyinstaller

2 投票
3 回答
2850 浏览
提问于 2025-04-17 14:40

我刚开始接触Qt,正在使用Qt-Designer来生成代码,以便与我用Python编写的程序进行交互。不过,当我想用pyinstaller把它们编译成可执行文件时,/dist/文件夹的大小大约有60MB。当我使用--onefile选项时,大小能降到大约20MB。

我觉得这个文件变大的问题是因为Qt引入了一些不必要的库。有没有人能告诉我怎么减少这个令人担忧的文件大小?我觉得20MB对于我写的这些简单应用来说实在是太大了。谢谢大家的帮助。

使用的环境: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 个回答

1

更好的是,我在CadentOrange的建议基础上,使用了命令ldd -u,这个命令实际上会显示未使用的直接依赖项。通过这种分析方法,我发现上面列出的绝大部分内容都是没用的,最后把列表缩减到了仅仅5个文件。对于一个单目录部署的应用,我成功把文件大小减少到了大约10MB!!希望这能帮助到其他可能遇到同样问题的人。

2

顺便提一下,可以看看这个Hatchet项目,它在Github上,主要用来分析应用程序的依赖关系,并重建PySide的绑定,以便更好地适配。

Qt5正在朝着减少依赖的方向发展,把大库拆分成更小的库。这样的话,使用pyinstaller打包的PyQt5应用可能会更轻便。

即使你只导入了需要的模块,我也不太确定Pyinstaller或Hatchet能否做到你所说的那样,分析Python直接绑定的库是否依赖于那些Python没有直接绑定的库。

对我来说,更糟糕的问题是,Pyinstaller会把一些系统库,比如libxcb,打包成不兼容新版本其他库的状态,这在新版本的操作系统上会出问题。例如,我在Ubuntu 13.04上打包的应用在13.10上崩溃,而在13.10上打包的应用在14.04beta上也崩溃。不过有一些解决办法。

4

如果你要使用Qt4,那么这些“臃肿”的文件是无法避免的,因为这些库是Qt4的依赖项。

为了验证这一点,你可以用ldd这个命令来查看一个库的共享依赖。试着运行ldd libQtGui.so.4,看看它依赖了多少个库。然后对其他共享库也做同样的操作。

我个人觉得不需要太担心你的可执行文件的大小。正如你所注意到的,主要是因为Qt的原因,所以随着你的应用程序的发展,生成的文件大小几乎不会有什么变化。

撰写回答