Matplotlib: отображение сюжета на удаленной машине - PullRequest
47 голосов
/ 11 августа 2010

У меня есть код Python, выполняющий некоторые вычисления на удаленной машине с именем A. Я подключаюсь к A через ssh с машины с именем B. Можно ли отобразить рисунок на машине B?

Ответы [ 7 ]

26 голосов
/ 11 августа 2010

Конечно, вы можете включить пересылку X11. Обычно это делается путем передачи опции -X или -Y в ssh при подключении к удаленному компьютеру

ssh -X computerA

Обратите внимание, что демон SSH на компьютере A также необходимо настроить для включения пересылки X11. Это делается путем помещения

X11Forwarding yes

в файле конфигурации sshd_config компьютера А.

Если у демона SSH компьютера A не включена пересылка X11, Python всегда может записать результат вычисления в текстовый файл, загрузить его на компьютер B и использовать Matplotlib локально.

23 голосов
/ 11 августа 2010

Если вы используете matplotlib в Mac OS X на удаленном компьютере (B), вы должны сначала убедиться, что вы используете один из внутренних интерфейсов дисплея на основе X11, так как собственный внутренний Mac OS X не может экспортировать его сюжеты на другой дисплей. Выбор серверной части может быть достигнут с помощью

import matplotlib
matplotlib.use('GTK')  # Or any other X11 back-end

Список поддерживаемых back-endов можно получить, указав use() неверное имя back-end: затем matplotlib напечатает сообщение об ошибке со списком возможных back-end.

Затем можно использовать пересылку ssh X11 для отображения графиков matplotlib.

12 голосов
/ 24 октября 2014

Следующее работало для меня с использованием 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 user@machineA

Затем на удаленной машине:

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

8 голосов
/ 20 апреля 2018

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()
1 голос
/ 03 января 2019

Я использовал 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://localhost:8080/?token=5528ab1eeb3f621b90b63420f8bbfc510edf71f21437c4e2

Шаг 3:

Теперь откройте другой терминал на локальном компьютере (B) и подключитесь к удаленному компьютеру (A), используя ssh:

ssh -N -L 8080:localhost:8080 user_id@remote.host

Номер порта должен быть одинаковым на шаге 2 и шаг 3 .В этом примере номер порта - 8080.

Шаг 4:

Скопируйте и вставьте URL-адрес на шаге 3 в браузер вваш локальный компьютер (B).

Теперь ноутбук на удаленном компьютере можно использовать через браузер, а график можно создавать с использованием данных на удаленном компьютере.

1 голос
/ 10 июля 2018

, если это не сработает, вы также можете попробовать:

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/

0 голосов
/ 07 июля 2019

export MPLBACKEND="agg" это сработало для меня.очевидно, вы также можете установить его с помощью кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...