2

我对 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
4

3 回答 3

4

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

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

我个人不会太担心可执行文件的大小。正如您所注意到的,这主要取决于 Qt,这意味着生成的二进制文件的大小几乎不会随着应用程序的增长而改变。

于 2013-02-04T08:52:24.910 回答
2

仅供参考, Hatchet是一个 Github 项目,用于分析应用程序中的依赖关系并重建 PySide 绑定以适应。

Qt5 正朝着减少依赖的方向发展,将库分解为更小的库。也许 pyinstalled PyQt5 应用程序的膨胀较小。

即使您只导入您需要的模块,我也不确定 Pyinstaller 或 Hatchet 是否会像您所做的那样,分析 Python 直接绑定到的库是否依赖于 Python 不直接绑定到的库。

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

于 2014-03-27T15:54:22.700 回答
1

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

于 2013-02-06T15:54:49.343 回答