[英]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.