web-dev-qa-db-ja.com

Matplotlib:リモートマシンでプロットを表示する

Aという名前のリモートマシンで計算を行うpythonコードがあります。Bという名前のマシンからsshを介してAに接続します。図を表示する方法はありますかマシンBで?

48
Mermoz

リモートマシンのMac OS Xでmatplotlibを使用する場合(B)、最初にX11ベースのディスプレイバックエンドのいずれかを使用する必要があります。これは、ネイティブのMac OS Xバックエンドがそのプロットを別の表示。バックエンドの選択は、次の方法で実現できます。

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

サポートされているバックエンドのリストは、use()に誤ったバックエンド名を与えることで取得できます:matplotlibは、可能性のあるバックエンドをリストするエラーメッセージを出力します。

ssh X11転送を使用して、matplotlibプロットを表示できます。

23
Eric O Lebigot

もちろん、X11転送を有効にできます。通常、これは、リモートコンピューターに接続するときに-Xまたは-Yオプションをsshに渡すことで実行されます。

ssh -X computerA

X11転送を有効にするには、コンピューターAのSSHデーモンも構成する必要があることに注意してください。これは

X11Forwarding yes

コンピューターAのsshd_config構成ファイル。

コンピューターAのSSHデーモンでX11転送が有効になっていない場合は、常にPython計算結果をテキストファイルに書き込み、コンピューターBにダウンロードして、Matplotlibをローカルで使用できます。

27
David Z

以下は、ローカルマシン(マシンB)でMac OS Xを使用し、リモート(マシンA)でubuntuを使用して機能しました。

これを行うには、ローカルマシンにX11サーバーをインストールする必要があります。

Mac OSXの最新バージョン(OS X Mountain Lion以降)を実行している場合、X11がプレインストールされていません( http://support.Apple.com/kb/ht5293を参照 )。 Macターミナルを開いてX11があるかどうかを確認し、xtermコマンドを実行します。 X11ウィンドウが開いたら、準備は完了です。 command not foundと表示されている場合は、 http://xquartz.macosforge.org/landing/ に移動してX11サーバーをインストールします。次に、ログアウトして、Macに再度ログインします。

再度ログインした後、xtermコマンドを再度実行してください。 X11ウィンドウが開きます。この時点で、$ DISPLAY変数も正しく設定する必要があります。設定されていない場合は、XQuartzからX11をインストールしてからログイン/ログアウトしていることを確認してください。

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から他のものをインポートする前に、必ずmatplotlib.useを呼び出してください(例:matplotlib.pyplot

Ssh -Xの使用に関するその他の便利なトラブルシューティングのヒント: http://oroborosx.sourceforge.net/remotex.html#usessh

12
ValAyal

GTKは、Python3を使用してUbuntuで作業することは不可能のようです。代わりに、tkaggを使用しました(from this answer):

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

IPythonを使用して、関連する問題を解決しました。手順は次のとおりです。

ステップ1:次のコマンドを使用して、IPythonとJupyterをリモートマシン(A)にローカルにインストールします(ルート権限がない場合)。

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)で別のターミナルを開き、sshを使用してリモートマシン(A)に接続します。

ssh -N -L 8080:localhost:8080 [email protected]

ポート番号は、ステップ2ステップ3で同じでなければなりません。この例では、ポート番号は8080です。

ステップ4:

ステップ3のURLをローカルマシンのブラウザにコピーして貼り付けます(B)。

これで、リモートマシンのノートブックはブラウザから使用でき、リモートマシンのデータを使用してプロットを生成できます。

1
Farhana Liza

それがうまくいかない場合は、試してみることもできます:

import matplotlib.pyplot as plt
plt.switch_backend('agg')

または

import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')

これは私のために働いたようだ

それでも、GUIを機能させたい場合は、次のリンクを参照することをお勧めします。 http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

1
Samaksh Goyal

export MPLBACKEND="agg"これは私のために働いた。もちろん、コードを介して設定することもできます。

0
amazia