Я генерирую рисунки matplotlib в сценарии, который я запускаю альтернативно с графическим дисплеем или без него. Я хотел бы, чтобы скрипт настраивался автоматически: с дисплеем он должен показывать фигуры интерактивно, а без дисплея он должен просто сохранять их в файл.
Из ответа на вопрос Генерация графиков matplotlib без работающего X-сервера я узнал, что для неинтерактивного построения графиков можно использовать бэкенд Agg.
Поэтому я пробую с таким кодом:
import matplotlib
try:
import matplotlib.pyplot as plt
fig = plt.figure()
havedisplay = True
except:
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig = plt.figure()
havedisplay = False
# do the plotting
if havedisplay:
plt.show()
else:
fig.savefig("myfig.png")
Это работает как исключение в случае с дисплеем. Однако без дисплея вызов matplotlib.use
не работает, так как дисплей уже выбран. Понятно, что я должен вызвать matplotlib.use
перед import matplotlib.pyplot
, но тогда я не знаю, как проверить, доступен дисплей или нет.
Я также пробовал использовать экспериментальную функцию matplotlib.switch_backend
вместо matplotlib.use
, но она выдает RuntimeError.
Есть ли у кого-нибудь идея, как заставить вышеприведенный код работать так, как задумано, или может предложить альтернативный способ определить, доступен ли дисплей для matplotlib или нет?