Да. Если вы вызываете вызов ThreadA, тогда не нужно вызывать метод start, а метод run - это вызов после вызова класса ThreadA. Но если использовать ThreadB-вызов, тогда необходимо создать начальный поток для метода вызова. Если у вас есть дополнительная помощь, ответьте мне.
Основная проблема заключается в том, что (в вашей системе) matplotlib по умолчанию использует x-using бэкэнд. У меня была одна и та же проблема на одном из моих серверов. Решение для меня заключалось в том, чтобы добавить следующий код в место, которое читает перед любым другим импортом pylab / matplotlib / pyplot:
import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')
Альтернативой является установка его в ваш .matplotlibrc
Еще одна вещь, чтобы проверить, разрешен ли ваш текущий пользователь для подключения к X-дисплею. В моем случае root не был допущен к этому, и matplotlib жаловался на ту же ошибку.
user@debian:~$ xauth list
debian/unix:10 MIT-MAGIC-COOKIE-1 ae921efd0026c6fc9d62a8963acdcca0
root@debian:~# xauth add debian/unix:10 MIT-MAGIC-COOKIE-1 ae921efd0026c6fc9d62a8963acdcca0
root@debian:~# xterm
source: http://www.debian-administration.org/articles/494 https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_su
Чистый ответ - потратить немного времени на правильную подготовку среды выполнения.
Первым методом, который вы должны подготовить среду исполнения, является использование файла matplotlibrc
, как разумно рекомендованный Крисом К. , установив
backend : Agg
в этом файле. Вы можете даже контролировать - без изменений кода - , как и где ищет matplotlib, и находит файл matplotlibrc
.
Второй метод, который вы должны подготовить для своей среды выполнения, - это используйте переменную среды MPLBACKEND
(и сообщите своим пользователям об использовании):
export MPLBACKEND="agg"
python <program_using_matplotlib.py>
Это удобно, потому что вам даже не нужно предоставлять другой файл на диске, чтобы сделать эту работу. Я использовал этот подход, например, для тестирования в непрерывной интеграции и для работы на удаленных компьютерах, которые не имеют дисплеев.
Жесткое кодирование вашего backplan matplotlib для «Agg» в вашем коде на Python похоже на избиение квадратный колышек в круглое отверстие с большим молотком, когда вместо этого вы могли просто сказать matplotlib, что это должно быть квадратное отверстие.
При входе в сервер для выполнения этого кода используйте это:
ssh -X username@servername
-X
избавится от отображаемого имени без знака переменной DISPLAY
:)
Как дополнение к ответу Рейно.
Постоянный способ решить эту проблему - отредактировать файл .matplotlibrc. Найдите его через
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
# This is the file location in Ubuntu
'/etc/matplotlibrc'
Затем измените бэкэнд в этом файле на backend : Agg
. Вот и все.
$MATPLOTLIBRC
в каталог i>, где вы хотите бросить свой собственный matplotlibrc.
– Kenneth Hoste
29 August 2013 в 19:19
Я получил ошибку при использовании matplotlib через Spark. matplotlib.use('Agg')
не работает для меня. В конце концов, для меня работает следующий код. Подробнее здесь
import matplotlib.pyplot as plt.
plt.switch_backend('agg')
Для Google Learning Engine Engine:
import matplotlib as mpl
mpl.use('Agg')
from matplotlib.backends.backend_pdf import PdfPages
И затем для печати в файл:
#PDF build and save
def multi_page(filename, figs=None, dpi=200):
pp = PdfPages(filename)
if figs is None:
figs = [mpl.pyplot.figure(n) for n in mpl.pyplot.get_fignums()]
for fig in figs:
fig.savefig(pp, format='pdf', bbox_inches='tight', fig_size=(10, 8))
pp.close()
и для создания PDF:
multi_page(report_name)
Я обнаружил, что этот фрагмент хорошо работает при переключении между средами X и no-X.
import os
import matplotlib as mpl
if os.environ.get('DISPLAY','') == '':
print('no display found. Using non-interactive Agg backend')
mpl.use('Agg')
import matplotlib.pyplot as plt
В какой системе вы работаете? Похоже, у вас есть система с X11, но переменная среды DISPLAY была неправильно настроена. Попробуйте выполнить следующую команду, а затем повторно запустить вашу программу:
export DISPLAY=localhost:0
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
Это работает для меня.
Я просто повторю то, что сказал @ Иво Бостицки, которого можно упустить. Поместите эти строки в ОЧЕНЬ старт файла py.
import matplotlib
matplotlib.use('Agg')
Или получится ошибка
*/usr/lib/pymodules/python2.7/matplotlib/__init__.py:923: UserWarning: This call to matplotlib.use() has no effect because the the backend has already been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot,*
Это решит проблему отображения
.use
для указания бэкэнд. – Noufal Ibrahim 17 June 2010 в 12:08backend: agg
в~/.config/matplotlib'/matplotlibrc
(например, см. http: //matplotlib.org/faq/troubleshooting_faq.html#locating-matplotlib-config-dir). См. Также matplotlib.org/users/customizing.html , в котором есть пример файла конфигурации внизу страницы. Найти & quot; agg & quot; на этой странице, и вы увидите нужный вариант конфигурации. – Reinout van Rees 6 July 2015 в 08:48