У меня есть код python, выполняющий некоторые вычисления на удаленной машине, с именем A. Я подключаюсь через A через ssh
к машине с именем B.
Есть ли способ отобразить фигуру на машине B?
Matplotlib: отображение графика на удаленной машине
Ответ 1
Если вы используете matplotlib в Mac OS X на удаленном компьютере (B), вы должны сначала убедиться, что вы используете один из оконных дисплеев на основе X11, так как родной Mac OS X не может экспортировать свои графики в другой дисплей. Выбор серверной части может быть достигнут с
import matplotlib
matplotlib.use('GTK') # Or any other X11 back-end
Список поддерживаемых серверных частей можно получить, указав для use()
неправильное имя серверной части: matplotlib затем напечатает сообщение об ошибке, в котором перечислены возможные серверные части.
Затем можно использовать пересылку ssh X11 для отображения графиков matplotlib.
Ответ 2
Конечно, вы можете включить пересылку X11. Обычно это делается путем передачи опции -X
или -Y
на ssh
при подключении к удаленному компьютеру
ssh -X computerA
Обратите внимание, что демон SSH на компьютере A также должен быть настроен для включения пересылки X11. Это делается путем размещения
X11Forwarding yes
в файле конфигурации A sshd_config
.
Если на компьютере. В SSH-демоне нет включенной переадресации X11, вы всегда можете написать Python результат вычисления в текстовый файл, загрузить его на компьютер B и локально использовать Matplotlib.
Ответ 3
Следующее работало для меня, используя Mac OS X на локальном компьютере (машина B) и ubuntu на удаленном компьютере (машина A).
Для этого вам понадобится сервер X11, установленный на вашей локальной машине.
Если вы используете последнюю версию Mac OSX (OS X Mountain Lion или новее), она не была бы установлена с предустановленной X11 (см. http://support.apple.com/kb/ht5293). Проверьте, есть ли у вас X11, открыв терминал Mac и выполните команду xterm
.
Если откроется окно X11, вы все настроены. Если он говорит, что команда не найдена, перейдите в http://xquartz.macosforge.org/landing/ и установите сервер X11. Затем выйдите из системы и войдите в свой Mac.
После входа в систему попробуйте снова запустить команду xterm
. Он должен открыть окно X11.
В этот момент ваша переменная $DISPLAY также должна быть правильно установлена. Если он не установлен, убедитесь, что вы вошли в систему из-за установки X11 из XQuartz.
echo $DISPLAY
/tmp/launch-I9I3aI/org.macosforge.xquartz:0
Затем с вашей локальной машины используйте ssh -X для удаленного удалённого компьютера A:
ssh -X [email protected]
Затем на удаленном компьютере:
python
>>> import matplotlib
>>> matplotlib.use('GTKAgg') #I had to use GTKAgg for this to work, GTK threw errors
>>> import matplotlib.pyplot as plt #... and now do whatever you need...
Убедитесь, что вы вызываете matplotlib.use
ПЕРЕД тем, как импортировать что-либо еще из matplotlib
(например, matplotlib.pyplot
)
Другие полезные советы по устранению неполадок при использовании ssh -X: http://oroborosx.sourceforge.net/remotex.html#usessh
Ответ 4
GTK кажется невозможным для работы над Ubuntu с Python3. Вместо этого я использовал tkagg (из этого ответа):
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
проверить с этим:
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.show()
Ответ 5
если это не сработает, вы также можете попробовать:
import matplotlib.pyplot as plt
plt.switch_backend('agg')
или же
import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')
мне показалось, что это работает
Тем не менее, если вы пытаетесь заставить работать графический интерфейс, я предлагаю вам взглянуть на эту ссылку: http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/
Ответ 6
Я использовал IPython для решения связанной проблемы. Шаги следующие:
Шаг 1: Установите IPython и Jupyter на удаленной машине (A) локально (без привилегий root) с помощью следующих команд:
pip install --user ipython
pip install --user jupyter
Обновление matplotlib:
pip install --user -U matplotlib
Шаг 2:
Запустите Jupyter без браузера из каталога кодов на удаленном компьютере (A):
cd PATH/TO/THE/CODE
jupyter notebook --no-browser --port=8080
После этой команды URL получит нечто похожее на приведенное ниже:
HTTP://локальный: 8080/маркер = 5528ab1eeb3f621b90b63420f8bbfc510edf71f21437c4e2
Шаг 3:
Теперь откройте другой терминал на локальной машине (B) и подключитесь к удаленной машине (A), используя ssh:
ssh -N -L 8080:localhost:8080 [email protected]
Номер порта должен быть одинаковым на шаге 2 и шаге 3. В этом примере номер порта - 8080.
Шаг 4:
Скопируйте и вставьте URL-адрес на шаге 3 в браузер на локальном компьютере (B).
Теперь записная книжка на удаленной машине может использоваться через браузер, а график может быть создан с использованием данных на удаленной машине.
Ответ 7
export MPLBACKEND="agg"
это сработало для меня. очевидно, вы также можете установить его с помощью кода.