_tkinter.TclError:表示名も$ DISPLAY環境変数もありません


193

サーバーで単純なpythonスクリプトを実行しています。

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randn(60)
y = np.random.randn(60)

plt.scatter(x, y, s=20)

out_png = 'path/to/store/out_file.png'
plt.savefig(out_png, dpi=150)

python example.pymatplotlib 1.5.1がインストールされているこのサーバーでコマンドを使用しようとすると、次のエラーで失敗します。

Traceback (most recent call last):
  File "example.py", line 7, in <module>
    plt.scatter(x, y, s=20)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 3241, in scatter
    ax = gca()
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 928, in gca
    return gcf().gca(**kwargs)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 578, in gcf
    return figure()
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/pyplot.py", line 527, in figure
**kwargs)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 84, in new_figure_manager
    return new_figure_manager_given_figure(num, figure)
  File "/home/USER/.virtualenvs/nnet/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 92, in new_figure_manager_given_figure
    window = Tk.Tk()
  File "/usr/local/lib/python2.7/lib-tk/Tkinter.py", line 1810, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

ここで何が起きてるの?


10
これをsshで実行していますか?
Padraic Cunningham 2016

8
...なしで-X
クラウスD.

1
Jupyter Notebookで実行する場合、このコマンドをNotebookで実行します%matplotlib inline
GoingMyWay

Winマシンからリモートサーバーにputty経由で接続する場合、XmingをインストールしてX11を転送する必要があります。
セレニティ

回答:


291

MatplotlibはデフォルトでXwindowsバックエンドを選択します。Xwindowsバックエンドを使用しないようにmatplotlibを設定する必要があります。

このコードをスクリプトの先頭に追加して(pyplotをインポートする前に)、再試行します。

import matplotlib
matplotlib.use('Agg')

または、非インタラクティブバックエンドを使用するために.config/matplotlib/matplotlibrcbackend: Aggに追加します。

echo "backend: Agg" > ~/.config/matplotlib/matplotlibrc

または、サーバーに接続するときに、ssh -X remoteMachineXwindowsを使用するコマンドを使用します。

また、ディスプレイをエクスポートしてみてください:export DISPLAY=mymachine.com:0.0

詳細:https : //matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server


13
'ssh -X remoteMachine'は私の問題を解決しました。ありがとうございました!
user3654307

6
実際に「Agg」とは何ですか?
CKM 2017年

5
AGGはAnti-grain geometry engineの略です。
セレニティ2017年

5
matplotlib.use('Agg')私のために働く-Dockerイメージ内で実行します。
Mattia Paterna 2018年

これは私の問題を解決しました。私はGoogleクラウドVMで実行しています。これが同じ問題の解決に役立つことを願っています。
デモ

76

あなたはこれらの2行を追加することによって、それを解決することができ非常にあなたの.pyスクリプトの始まり。

import matplotlib
matplotlib.use('Agg')

PS:これらの2行がソースコードの最初に追加されていない場合でも、エラーは存在します。


17
それはコードの最初にあるべきです。これは重要。
ハンター

これはmatplotlibdocker(ディスプレイが接続されていない)で実行されているときに機能しましたが、実際には何をしますか?
loretoparisi 2018年

これは私がvmでpythonコンソールを実行するだけで機能しますが、実行中のアプリケーションの一部である場合、まったく同じコードが同じvmでまったく同じエラーで失敗します。
rschwieb

しかし、設定ファイルでバックエンドをTkAggからAggに変更するとうまくいきました。
rschwieb

41

答えを追加するために、必要なスクリプトの冒頭でこれを使用しました。したがって、さまざまな環境でスムーズに動作します。

import os
import matplotlib as mpl
if os.environ.get('DISPLAY','') == '':
    print('no display found. Using non-interactive Agg backend')
    mpl.use('Agg')
import matplotlib.pyplot as plt

'Agg'例えばTravis CIを通過する場合にのみ、バックエンドを常に使用したくなかったためです。


4
このソリューションには、個人的な構成が何であれ、最も煩わしくないソリューションという付加価値があります。それはもっと高いはずです。
jaumebonet 2018年

11

Raspberry Piでシンプルなtkinterアプリをリモートで実行しようとすると、同じ問題が発生しました。私の場合、tkinter GUIをpiディスプレイに表示したいのですが、ホストマシンからSSH経由で実行できるようにしたいと考えています。私もmatplotlibを使用していなかったため、それが問題の原因ではありませんでした。次のコマンドでエラーが示すように、DISPLAY環境変数を設定することで問題を解決できました。

export DISPLAY=:0.0

表示環境変数が何をしているか、および構文が奇妙である理由の適切な説明は、ここで見つけることができます:https : //askubuntu.com/questions/432255/what-is-display-environment-variable


18
pythonとmatplotlib.pyplotをsshで実行してプロットを保存しようとしています...これを実行すると、_tkinter.TclError:ディスプレイに接続できませんでした ":0.0"
mrk

2

別の解決策は、Xvfbをインストールして、それにディスプレイをエクスポートすることです。つまり:

disp=:8
screen=0
geom=640x480x24
exec Xvfb $disp -screen $screen $geom 2>/tmp/Xvfb.log &

その後

$エクスポートDISPLAY =:8

$ ./example.py


1

Xshellを使用してLinuxサーバーに接続しているときにも、この問題に遭遇しました。

メソッドを検索した後、matplotlibで画像のimshow問題を解決するXming + Xshellを見つけました。

上記の解決策で問題を解決できない場合は、Xshellを使用している状態でXmingをダウンロードしてみてください。次に、Xshellで属性を設定します。SSH- > tunnel-> X11transfer-> choose X DISPLAY localhost:0.0


1

リモートマシンのウィンドウに表示されている画像、プロットなどを表示するには、次のように接続する必要があります。

ssh -X user@hostname

このようにして、Xサーバーへのアクセスを有効にします。Xサーバーは、ローカルマシン(つまり、ユーザーが直接使用するコンピューター)で実行されるX Window Systemのプログラムであり、これらのコンピューターのグラフィックカード、ディスプレイ画面、および入力デバイス(通常はキーボードとマウス)へのすべてのアクセスを処理します。

詳細はこちら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.