繁体   English   中英

Python Pyside QT-在CLI上运行时防止由于导入导致的QT初始化

[英]Python Pyside QT - Prevent Initialization of QT due to imports when running on CLI

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

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

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

关于如何防止这种情况的任何提示? 我们可以存根并覆盖执行此操作的某些功能吗? 我们可以传递一些标志吗? 目前,我们的预防机制是追查不良的进口和重构。

因此,一种半解决方案是执行以下操作。 本质上是将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等库中的使用,这似乎需要大量工作。

不必完全避免初始化Qt,而是可以在CLI应用程序中使用QCoreApplication。 有关您可以改编的一些示例代码,请参见http://doc.qt.io/qt-5/qapplication.html中的QApplication详细说明。

此类模式的良好做法是对代码进行适当的组织,以使在CLI上运行时无法导入使用用户界面的代码。

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

以供参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM