【问题标题】:How to exclude unnecessary Qt *.so files when packaging an application?打包应用程序时如何排除不必要的 Qt *.so 文件?
【发布时间】:2019-08-12 18:46:11
【问题描述】:

使用 PyInstaller 成功打包我的 PySide 应用程序后,我在包文件夹中发现了许多不同的 *.so 文件。看到我的项目中没有使用的库,我很惊讶,例如:libQt53DAnimation.solibQt53DCore.solibQt5Multimedia.so 等。

我没有在源代码中导入它们,也没有将它们包含在隐藏的导入中。

正如我所读到的,PyInstaller 会自动查找应用程序运行所需的所有依赖项。如果我在打包后手动删除它们,那么我的应用程序运行时没有任何更改/麻烦。那就是指出它们没有必要,它们不应该被视为依赖项,不是吗?

那么有什么办法可以在打包的时候排除它们

【问题讨论】:

    标签: python pyinstaller packaging pyside2


    【解决方案1】:

    如果您确定它们对于您的应用程序来说不是必需的,您可以使用规范文件中的分析将它们排除在外。您只需添加它们,如下所示https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation

    你可以这样做:

    a.binaries = a.binaries - TOC([
      ('libQt53DAnimation.so', None, None),
      ('libQt53DCore.so', None, None),
      ('libQt5Multimedia.so', None, None),
    ])
    

    还有一个 --exclude-module EXCLUDES 用于排除模块,但不确定它与您的情况有多相关。

    不幸的是,pyinstaller 包含某些可选依赖项,正如 Hartmut Goebel 解释的 here

    PyInstaller 最好只包含所需的模块——那就是 PyInstaller 是关于 :-) 的。但是很多包都有可选的 您的程序可能不需要的依赖项,但是 对于其他程序。 PyInstaller 无法知道这一点,如果 PyInstaller 会删除很多,其他程序可能会失败。请使用选项 --exclude 为此。

    请记住,仅 Python 的“完整 unicode”功能 支持”添加了很多编解码器模块,这些模块看起来没有必要,但 Python 正常工作所必需的。

    【讨论】:

    • 感谢您的回复。很高兴有机会手动排除库,但如果我知道它们对我的应用程序没用(例如,我的项目中没有使用任何 3d 和多媒体,所以我可以用库名称来识别它们)并稍后删除)但是如何找出其他库?我怎么知道 lib libQt5Concurrent.so 不是另一个 lib 的重要依赖项?通过删除来检查它并查看哪些不起作用并不是一个好主意,尤其是在大型项目中。
    • @Artem 编辑了答案以解释添加额外 DLL 背后的原因
    • 我认为@Artem 的评论没有得到答复。有谁知道如何检查一个库是否需要或依赖于另一个必需的库?
    猜你喜欢
    • 2020-02-01
    • 2014-08-14
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多