Tkinter.TclError: не удалось подключиться к отображению "localhost: 18.0"
Я пытался запустить симуляцию (написанную на python) на центральном сервере, и когда симуляция закончена, переместите файл сохраненной фигуры/сохраненный файл данных на мой локальный компьютер, подключившись к локальному ПК. Код выглядит следующим образом:
import matplotlib.pyplot as plt
import subprocess
import scipy.io
import os
#Save data file:
scipy.io.savemat(data_path + Filename_str, dict(A=board))
#Create / Save figure by using imshow (Heatmap)
p = plt.imshow(mean_map.T, cmap = plt.cm.gist_yarg_r, origin = 'lower', extent = [0, phi, 0, Z], aspect='auto')
plt.savefig(figure_path + Filename_str + '-Homophily.pdf')
# Connect to my local host (arabian-knights) using ssh, and follow command.
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Data/* /scratch/Data/'])
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Figure/* /scratch/Figure/'])
Я запускаю эту симуляцию на фоне серверного компьютера, после подключения к серверному компьютеру с моего локального компьютера (арабских рыцарей). Несмотря на то, что я отключу подключение к серверному компьютеру, так как симуляция работает в фоновом режиме, это не останавливается, и файлы данных правильно перемещаются на мой локальный компьютер после того, как имитация выполнена. Однако файлы с рисунком (созданные с помощью matplotlib.pyplot.imshow) не сохраняются, отображая следующие сообщения об ошибках:
Traceback (most recent call last):
File "./ThrHomoHeatmap-thrstep.py", line 179, in <module>
p = plt.imshow(board.T, cmap = plt.cm.gist_yarg_r, vmin=0, vmax=n, origin = 'lower', extent = [0, phi, 0, Z], aspect='auto')
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2370, in imshow
ax = gca()
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 701, in gca
ax = gcf().gca(**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 369, in gcf
return figure()
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 343, in figure
**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 80, in new_figure_manager
window = Tk.Tk()
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1688, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "localhost:18.0"
Есть ли кто-нибудь, кто может решить эту проблему, переместить файлы matplotlib.pyplot с сервера на локальный компьютер?
Ответы
Ответ 1
Проблема заключается в том, что вы используете интерактивный бэкэнд, который пытается создать фигурные окна для вас, которые не работают, потому что вы отключили x-сервер, который был доступен при запуске имитации.
Измените импорт на
import matplotlib
matplotlib.use('pdf')
import matplotlib.pyplot as plt
Ответ 2
Создание изображений без появления окна (фон)
используйте неинтерактивный бэкэнд (см. Что такое backend?), например Agg
(для PNG
s), PDF
, SVG
или PS
. В генерации script, просто вызовите директиву matplotlib.use()
перед импортом pylab
или pyplot
:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
Примечание. Этот ответ был кратко указан в комментарии. Я поставил его здесь как ответ, чтобы увеличить видимость, так как это помогло мне, и мне посчастливилось, что я решил прочитать комментарии.