Aという名前のリモートマシンで計算を行うpythonコードがあります。Bという名前のマシンからssh
を介してAに接続します。図を表示する方法はありますかマシンBで?
リモートマシンの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プロットを表示できます。
もちろん、X11転送を有効にできます。通常、これは、リモートコンピューターに接続するときに-X
または-Y
オプションをssh
に渡すことで実行されます。
ssh -X computerA
X11転送を有効にするには、コンピューターAのSSHデーモンも構成する必要があることに注意してください。これは
X11Forwarding yes
コンピューターAのsshd_config
構成ファイル。
コンピューターAのSSHデーモンでX11転送が有効になっていない場合は、常にPython計算結果をテキストファイルに書き込み、コンピューターBにダウンロードして、Matplotlibをローカルで使用できます。
以下は、ローカルマシン(マシン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
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()
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)。
これで、リモートマシンのノートブックはブラウザから使用でき、リモートマシンのデータを使用してプロットを生成できます。
それがうまくいかない場合は、試してみることもできます:
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/
export MPLBACKEND="agg"
これは私のために働いた。もちろん、コードを介して設定することもできます。