We currently force ImportErrors to prevent dev-python/QtPy from using a particular backend if it wasn't enabled via USE flags (I suppose to prevent flag mismatches). However, QtPy has this fancy logic that if some backend is in sys.modules already, it implicitly forces that backend. If this backend wasn't enabled via USE flags, it effectively fails to load. For example: In [1]: import qtpy In [2]: qtpy.API_NAME Out[2]: 'PyQt5' but: In [1]: import PyQt6 In [2]: import qtpy --------------------------------------------------------------------------- QtBindingsNotFoundError Traceback (most recent call last) Cell In[2], line 1 ----> 1 import qtpy File /usr/lib/python3.10/site-packages/qtpy/__init__.py:283 280 QT6 = PYSIDE6 = True 282 except ImportError: --> 283 raise QtBindingsNotFoundError from None 284 else: 285 os.environ[QT_API] = API QtBindingsNotFoundError: No Qt bindings could be found
There is the FORCE_QT_API env var which should prevent QtPy from doing this[1]: ''' Add the FORCE_QT_API environment variable to keep using the Qt bindings selected with the QT_API variable and avoid switching to the currently imported bindings. This allows to have applications that import PySide and PyQt bindings at the same time (which is possible if both bindings are compiled for the same Qt version). ''' I wonder what the best solution is here, force set this variable somehow, or just patch out line 188 to 197 of __init__.py. [1] https://github.com/spyder-ide/qtpy/blob/master/CHANGELOG.md#version-190-2019-07-23
> elog "the first enabled target in this order: PyQt5 PySide2 PyQt6 PySide6." Maybe an option could be to change the priority rather than raise errors, aka if PyQt5 is disabled then move it to the end of the list and it'll prevent loading a mismatching one by default. Albeit I guess it'd be kind of ugly to change the if/elif block from the ebuild.
The bug has been closed via the following commit(s): https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ad167a488a979260256cb3513dbe7594b9276fc9 commit ad167a488a979260256cb3513dbe7594b9276fc9 Author: Andrew Ammerlaan <andrewammerlaan@gentoo.org> AuthorDate: 2023-10-26 15:15:11 +0000 Commit: Andrew Ammerlaan <andrewammerlaan@gentoo.org> CommitDate: 2023-10-26 15:18:31 +0000 dev-python/QtPy: properly handle implicit QT_API behaviour If a Qt4Python implementation has already been imported QtPy tries to use that implementation by default, even if this implementation is disabled by USE flag configuration. Here we add some extra sed's to remove the sys.modules check for implementations that we have disabled, taking care that the first entry in the if block always starts with if and not elif. Closes: https://bugs.gentoo.org/916298 Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> .../{QtPy-2.4.1.ebuild => QtPy-2.4.1-r1.ebuild} | 43 ++++++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-)
(In reply to Andrew Ammerlaan from comment #1) > I wonder what the best solution is here, force set this variable somehow, or > just patch out line 188 to 197 of __init__.py. Ended up going with neither of these options, but with sed instead. This way we retain the behaviour that implicitly selects an already imported Qt4Python implementation, but prevent this from selecting an implementation that we have disabled. It is not pretty, especially because we have to ensure this if block starts with an if, not an elif, but it works.