Автоматическое определение доступности дисплея с matplotlib

Я генерирую рисунки 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 или нет?

15
задан Oz123 29 January 2019 в 17:30
поделиться