Matplotlib: отображение сюжета на удаленной машине

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

12 ответов

Решение

Если вы используете 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.

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

ssh -X computerA

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

X11Forwarding yes

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

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

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

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()

Я использовал 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).

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

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

Просто хотел добавить - если вы используете Windows в качестве локального компьютера, убедитесь, что вы настроили Xming (сервер X Windows) и Putty, чтобы вы могли видеть удаленные графические приложения Linux.

Я выполнил инструкции здесь: http://laptops.eng.uci.edu/software-installation/using-linux/how-to-configure-xming-putty, чтобы сделать это. Он также устанавливает среду отображения и переменную, чтобы вы не получали ошибку при использовании tkagg как бэкэнд.

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

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/

Временное решение (на самом деле я ищу, как это сделать) — использовать VSCode для удаленного подключения, сохранить график и просто щелкнуть файл в VScode, который отобразит его. Это не идеально, но...

Вы можете использовать созданную мной библиотеку для решения этой проблемы https://pypi.org/project/remote-plot/.

Он использует тот же API, что и matplotlib, но отображает графики в веб-браузере, который вы можете просматривать на своем компьютере B.

Установить:

      pip install remote_plot

А затем запустите на питоне вот так:

      from remote_plot import plt
plt.plot([1, 2, 3], [4, 5, 6])

По умолчанию он открывает рендеринг на порту 8000, но вы можете легко изменить это. Если вы подключаетесь через ssh, не забудьте перенаправить порт, добавив следующий флаг в команду ssh:

      ssh YOUR_USER_NAME@YOUR_MACHINE_IP -L 8000:localhost:8000

Это то, что я сделал с MacOS и удаленной машиной Linux.

  1. В ~ / .ssh / config я добавил следующее. Я добавляю это, поскольку возможно, что ваша машина может неправильно использовать местоположение xauth.
          XAuthLocation /opt/X11/bin/xauth
  1. ssh -Y имя_компьютера
  2. Запустите следующую фиктивную программу:
          import matplotlib.pyplot as plt
    x = [1,2,3]
    y = [2,4,1]
    plt.plot(x, y)
    plt.show()

Если вы используете Mac в качестве клиентской машины, попробуйте это.

По сути, вам нужно убедиться, что две вещи работают правильно.

  • Использование GTK или Cairo в качестве серверной части.
  • Пересылка дисплея.

Использование GTK или Cairo в качестве matplotlibсерверная часть

Если вы используете python3, вы должны установить cairocffi.

      pip install cairocffi

Затем используйте GTK3Agg как серверную часть matplotlib.

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

См. Следующее описание из документа matplotlib для более подробной информации.

И GTK2, и GTK3 имеют неявные зависимости от PyCairo независимо от используемого конкретного бэкенда Matplotlib. К сожалению, в последней версии PyCairo для Python3 не реализованы оболочки Python, необходимые для бэкэнда GTK3Agg. Cairocffi можно использовать в качестве замены, которая реализует правильную оболочку.

Пересылка дисплея

  1. Установить запуск последней версии XQuartz.
  2. Подключитесь к удаленному серверу, используя ssh -X. бывший) ssh username@ipaddress -X
Другие вопросы по тегам