From 4867149d83e0b77feb8e77df7cdcceb11357ff23 Mon Sep 17 00:00:00 2001 From: Luke Campagnola Date: Wed, 24 Jan 2018 09:03:44 -0800 Subject: [PATCH] Be a little more tolerant of missing Qt packages, and defer import errors until we try to use the missing package. --- pyqtgraph/Qt.py | 62 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/pyqtgraph/Qt.py b/pyqtgraph/Qt.py index ad04cd76..749943f2 100644 --- a/pyqtgraph/Qt.py +++ b/pyqtgraph/Qt.py @@ -43,8 +43,29 @@ if QT_LIB is None: if QT_LIB is None: raise Exception("PyQtGraph requires one of PyQt4, PyQt5 or PySide; none of these packages could be imported.") + +class FailedImport(object): + """Used to defer ImportErrors until we are sure the module is needed. + """ + def __init__(self, err): + self.err = err + + def __getattr__(self, attr): + raise self.err + + if QT_LIB == PYSIDE: - from PySide import QtGui, QtCore, QtOpenGL, QtSvg + from PySide import QtGui, QtCore + + try: + from PySide import QtOpenGL + except ImportError as err: + QtOpenGL = FailedImport(err) + try: + from PySide import QtSvg + except ImportError as err: + QtSvg = FailedImport(err) + try: from PySide import QtTest if not hasattr(QtTest.QTest, 'qWait'): @@ -55,9 +76,9 @@ if QT_LIB == PYSIDE: while time.time() < start + msec * 0.001: QtGui.QApplication.processEvents() QtTest.QTest.qWait = qWait - - except ImportError: - pass + except ImportError as err: + QtTest = FailedImport(err) + import PySide try: from PySide import shiboken @@ -133,16 +154,16 @@ elif QT_LIB == PYQT4: from PyQt4 import QtGui, QtCore, uic try: from PyQt4 import QtSvg - except ImportError: - pass + except ImportError as err: + QtSvg = FailedImport(err) try: from PyQt4 import QtOpenGL - except ImportError: - pass + except ImportError as err: + QtOpenGL = FailedImport(err) try: from PyQt4 import QtTest - except ImportError: - pass + except ImportError as err: + QtTest = FailedImport(err) VERSION_INFO = 'PyQt4 ' + QtCore.PYQT_VERSION_STR + ' Qt ' + QtCore.QT_VERSION_STR @@ -157,24 +178,25 @@ elif QT_LIB == PYQT5: # users), we install a global exception hook to override this behavior. ver = QtCore.PYQT_VERSION_STR.split('.') if int(ver[1]) >= 5: - sys_excepthook = sys.excepthook - def pyqt5_qabort_override(*args, **kwds): - return sys_excepthook(*args, **kwds) - sys.excepthook = pyqt5_qabort_override + if sys.excepthook == sys.__excepthook__: + sys_excepthook = sys.excepthook + def pyqt5_qabort_override(*args, **kwds): + return sys_excepthook(*args, **kwds) + sys.excepthook = pyqt5_qabort_override try: from PyQt5 import QtSvg - except ImportError: - pass + except ImportError as err: + QtSvg = FailedImport(err) try: from PyQt5 import QtOpenGL - except ImportError: - pass + except ImportError as err: + QtOpenGL = FailedImport(err) try: from PyQt5 import QtTest QtTest.QTest.qWaitForWindowShown = QtTest.QTest.qWaitForWindowExposed - except ImportError: - pass + except ImportError as err: + QtTest = FailedImport(err) # Re-implement deprecated APIs