Matplotlib - Tcl_AsyncDelete: асинхронный обработчик удален не тем потоком?
Я задаю этот вопрос, потому что я не могу решить одну проблему в Python/Django
(на самом деле в чистом Python это нормально), что приводит к RuntimeError: tcl_asyncdelete async handler deleted by the wrong thread
. Это как-то связано с тем, как я matplotlib
сюжеты matplotlib
в Django. Я делаю это так:
...
import matplotlib.pyplot as plt
...
fig = plt.figure()
...
plt.close()
Я чрезвычайно минимизировал мой код. Но подвох - даже если у меня есть только одна строка кода:
fig = plt.figure()
Я вижу, что происходит RuntimeError. Я надеюсь, что смогу решить проблему, если бы я знал правильный способ закрытия/очистки/уничтожения графиков в Python/Django.
Ответы
Ответ 1
По умолчанию matplotlib использует инструментарий TK gui, когда вы создаете изображение без использования инструментария (т.е. в файл или строку), matplotlib все еще создает окно, которое не отображается, вызывая всевозможные проблемы. Чтобы этого избежать, вы должны использовать бэкэнд Agg. Его можно активировать так:
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot
Для получения дополнительной информации обратитесь к документации matplotlib - http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server