Как надежно убедить matplotlib использовать серверную часть PySide2 при запуске из Anaconda (Spyder)

#python-3.x #matplotlib #anaconda #qt5 #pyside2

#python-3.x #matplotlib #anaconda #qt5 #pyside2

Вопрос:

Я создаю приложение PySide2, которое использует matplotlib. Я запускаю это приложение из Spyder в среде с установленным PySide2. Это приводит к запуску приложения из консоли IPython. Где-то по ходу импортируется PyQt5, который я пытаюсь очистить, чтобы убедить matplotlib, что я действительно хочу использовать PySide2, А НЕ PyQt5. Что-то вроде следующего работало до недавнего времени, и я не совсем уверен, почему это прекратилось, но можно с уверенностью сказать, что этот метод ненадежен. Как я могу полностью убедить matplotlib в том, что мне нужен PySide2?

Я попытался установить переменную окружения QT_API в операционной системе (Windows 10), но в этом случае сам Spyder отказывается открываться.

 import sys
import os

ps = list(filter(lambda x: 'PyQt5' in x, sys.modules))
for p in ps:
    print(f"purging module {p}")
    sys.modules.pop(p)
    
# matplotlib.__init__ uses this
os.environ["MPLBACKEND"] = "PySide2"

# matplotlib.backends.qt_compat uses this
os.environ["QT_API"] = "PySide2"

import PySide2.QtCore

assert "PyQt5.QtCore" not in sys.modules
assert "PySide2.QtCore" in sys.modules

# rcParams has the right idea
from matplotlib import rcParams
print(rcParams["backend"])

# qt_compat has the WRONG idea!
import matplotlib.backends.qt_compat as qt_compat
print(qt_compat.QT_API)

# The FigureCanvasWidget is of the wrong (PyQt5) type
from matplotlib.backends.backend_qt5agg import FigureCanvas
import inspect
print(inspect.getmro(FigureCanvas))
 

Ответ №1:

Чтобы ответить на этот вопрос, причина, по которой он перестал работать, заключалась в том, что я установил «активировать поддержку» для графики Matplotlib на вкладке ipython в настройках Spyder. После снятия этого флажка вышеуказанное работает.