import os import importlib import pytest from IPython.terminal.pt_inputhooks import set_qt_api, get_inputhook_name_and_func guis_avail = [] def _get_qt_vers(): """If any version of Qt is available, this will populate `guis_avail` with 'qt' and 'qtx'. Due to the import mechanism, we can't import multiple versions of Qt in one session.""" for gui in ["qt", "qt6", "qt5"]: print(f"Trying {gui}") try: set_qt_api(gui) importlib.import_module("IPython.terminal.pt_inputhooks.qt") guis_avail.append(gui) if "QT_API" in os.environ.keys(): del os.environ["QT_API"] except ImportError: pass # that version of Qt isn't available. except RuntimeError: pass # the version of IPython doesn't know what to do with this Qt version. _get_qt_vers() @pytest.mark.skipif( len(guis_avail) == 0, reason="No viable version of PyQt or PySide installed." ) def test_inputhook_qt(): # Choose the "best" Qt version. gui_ret, _ = get_inputhook_name_and_func("qt") assert gui_ret != "qt" # you get back the specific version that was loaded. assert gui_ret in guis_avail if len(guis_avail) > 2: # ...and now we're stuck with this version of Qt for good; can't switch. for not_gui in ["qt6", "qt5"]: if not_gui != gui_ret: break # Try to import the other gui; it won't work. gui_ret2, _ = get_inputhook_name_and_func(not_gui) assert gui_ret2 == gui_ret assert gui_ret2 != not_gui