簡體   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