web-dev-qa-db-ja.com

tkinter.TclError:「localhost:18.0」を表示するために接続できませんでした

中央サーバーでシミュレーション(Pythonで記述)を実行しようとしていましたが、シミュレーションが終了したら、保存されたFigureファイル/保存されたデータファイルをローカルPCに接続して、ローカルPCに移動します。コードは次のとおりです。

import matplotlib.pyplot as plt
import subprocess
import scipy.io
import os

#Save data file:
scipy.io.savemat(data_path + Filename_str, dict(A=board))

#Create / Save figure by using imshow (Heatmap)
p = plt.imshow(mean_map.T, cmap = plt.cm.Gist_yarg_r, Origin = 'lower',  extent = [0, phi, 0, Z], aspect='auto')
plt.savefig(figure_path + Filename_str + '-Homophily.pdf')

# Connect to my local Host (arabian-knights) using ssh, and follow command.
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Data/* /scratch/Data/'])
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Figure/* /scratch/Figure/'])

ローカルコンピューター(arabian-knights)からサーバーコンピューターに接続した後、サーバーコンピューターのバックグラウンドでこのシミュレーションを実行します。サーバーコンピューターへの接続をオフにしても、シミュレーションがバックグラウンドで実行されているため、シミュレーションが停止せず、シミュレーションの完了後にデータファイルがローカルコンピューターに正しく移動されます。ただし、Figureファイル(matplotlib.pyplot.imshowによって生成されます)は保存されず、次のエラーメッセージが表示されます。

Traceback (most recent call last):
  File "./ThrHomoHeatmap-thrstep.py", line 179, in <module>
    p = plt.imshow(board.T, cmap = plt.cm.Gist_yarg_r, vmin=0, vmax=n, Origin = 'lower',  extent = [0, phi, 0, Z], aspect='auto')
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2370, in imshow
    ax = gca()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 701, in gca
    ax =  gcf().gca(**kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 369, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 343, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 80, in new_figure_manager
    window = Tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1688, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "localhost:18.0"

Matplotlib.pyplotのFigureファイルをサーバーからローカルコンピューターに移動するために、この問題を解決できる人はいますか?

30
user2901339

問題は、Figureウィンドウを作成しようとしているインタラクティブなバックエンドを使用していることです。シミュレーションを開始したときに使用可能だったxサーバーを切断したために失敗しています。

インポートをに変更

import matplotlib
matplotlib.use('pdf')
import matplotlib.pyplot as plt
24
tacaswell

ウィンドウを表示せずに画像を生成(background

AggPNGsの場合)、PDFなどの非インタラクティブなバックエンド( backend ?を参照)を使用します。 SVGまたはPS。 Figureを生成するスクリプトで、pylabまたはpyplotをインポートする前に、matplotlib.use()ディレクティブを呼び出すだけです。

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

plt.plot([1,2,3])
plt.savefig('myfig')

:この回答はコメントで短く述べられました。私はそれを助けてくれて、コメントを読むことにしたので幸運だったので、私はそれを視認性を高めるための答えとしてここに置きました。

13
mrk