1

所以我们有一个用 Python 编写的相当大的程序,使用 PySide/QT 来完成它的大部分 GUI 工作。我们使用 Chaco 做一些绘图。

该程序还具有完整的 CLI 界面。

有时,开发人员会不小心创建一个导入链,导致我们的 CLI 运行尝试从 PySide 或 Chaco 导入某些内容。这导致我们的 CLI 运行因“无法连接到 x 服务器”而终止,因为 PySide 或 Chaco 正在尝试通过 QT 初始化 X。

关于如何防止这种情况的任何提示?我们可以存根并覆盖一些正在执行此操作的函数吗?我们可以传递一些标志吗?目前我们的预防机制是追踪不良导入和重构。

4

3 回答 3

0

与其完全避免初始化 Qt,不如在 CLI 应用程序中使用 QCoreApplication。请参阅http://doc.qt.io/qt-5/qapplication.html中 QApplication 的详细描述,了解您可以修改的一些示例代码。

于 2015-02-13T04:17:57.887 回答
0

因此,一种半解决方案是执行以下操作。基本上将 QApplication 类存根,并让它在 init 上打印堆栈跟踪。这会破坏事情,但是您将获得堆栈跟踪来执行 QtApplication 尝试初始化的第一个点。

_oldQtApplication = QtGui.QApplication

class BogusQApplication(QtGui.QApplication):
    def __init__(self, *args):
        import traceback
        print traceback.print_stack()

        _oldQtApplication.__init__(self, args)

QtGui.QApplication = BogusQApplication

一个更好的解决方案是基本上存根整个 QtApplication 类,这样它的用户仍然可以工作,但基本上有一个 NullQtApplication。不幸的是,基于 QtApplication 在 Chaco 的 PySide 等库中的使用,这似乎是大量的工作。

于 2015-02-12T19:58:29.567 回答
0

这种模式的良好实践是对代码进行适当的组织,其中使用用户界面的代码在 CLI 上运行时无法导入。

您可以通过以可插入方式设计应用程序来做到这一点,并且仅在以 CLI 模式运行时加载 CLI 所需的插件,并在使用 UI 运行时加载全套插件。我们广泛使用 Envisage 框架来构建可插拔应用程序并解决这些问题。在设计您的应用程序时需要更多的前期工作。

以供参考:

于 2015-02-13T09:06:12.230 回答