RuntimeError: основной поток не находится в основном цикле, используя Matplotlib с Django - PullRequest
0 голосов
/ 03 мая 2018

Я создаю фигуру Matplotlib для отображения в шаблоне HTML в моем приложении Django. Я отправляю этот рисунок в HTML, сохраняя его под моими статическими файлами, а затем загружая тег img с сохраненным .png. Я делаю это в моем views.py после получения ссылки на рисунок.

        # Get analysis visualization chart
        figure = analyser.visualize_tweets(emotions)

        # Save figure in static folder as png
        figure.savefig('static/analysis_figures/figure.png')

        # Inject html with figure path
        response['analysis_figure_path'] = 'analysis_figures/figure.png'

return render(request, 'landing_page/index.html', response)

Мой HTML выглядит примерно так:

<img src={% static analysis_figure %} alt="">

Однако, это вызвало RuntimeError: main thread is not in main loop, когда функция в моем views.py вызывается во второй раз (если она вызывается, когда все работает правильно). Чтобы предотвратить эту ошибку, я переместил сохранение рисунка Matplotlib в main(), чтобы запустить его в главном потоке, а затем вызвал его в своей исходной функции. Это исправило ошибку, но не позволяет перезагрузить мой HTML, поэтому каждый раз, когда пользователь отправляет запрос, новая фигура отображается поверх предыдущей без удаления предыдущей. Есть идеи по любой из проблем?

1 Ответ

0 голосов
/ 22 ноября 2018

Я думаю, что этот пост объясняет, что делать: Как чистить изображения в Python / Django?

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

Как объяснено здесь: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server

Чтобы предотвратить отображение нового рисунка поверх предыдущего, используйте: plt.close() / figure.close()

...