_tkinter.TclError: tidak ada nama tampilan dan tidak ada variabel lingkungan $ DISPLAY

194

Saya menjalankan skrip python sederhana di server:

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)

Saya mencoba menggunakan perintah python example.pydi server ini yang telah menginstal matplotlib 1.5.1 gagal dengan kesalahan:

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

Apa yang terjadi disini?

pengguna3654307
sumber
10
Apakah Anda menjalankan ini ssh?
Padraic Cunningham
8
... tanpa -X?
Klaus D.
1
Jika Anda menjalankannya di notebook Jupyter, jalankan perintah ini di notebook%matplotlib inline
GoingMyWay
Jika Anda terhubung dari mesin Win ke server jauh melalui dempul Anda harus menginstal Xming untuk meneruskan X11.
Serenity

Jawaban:

292

Matplotlib memilih Xwindows backend secara default. Anda perlu mengatur matplotlib untuk tidak menggunakan backend Xwindows.

Tambahkan kode ini ke awal skrip Anda ( sebelum mengimpor pyplot ) dan coba lagi:

import matplotlib
matplotlib.use('Agg')

Atau tambahkan ke .config/matplotlib/matplotlibrcbaris backend: Agguntuk menggunakan backend non-interaktif.

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

Atau ketika terhubung ke server gunakan ssh -X remoteMachineperintah untuk menggunakan Xwindows.

Juga Anda dapat mencoba untuk mengekspor tampilan: export DISPLAY=mymachine.com:0.0.

Untuk info lebih lanjut: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server

Ketenangan
sumber
13
'ssh -X remoteMachine' memecahkan masalah saya. Terima kasih!
user3654307
6
apa sebenarnya 'Agg'?
CKM
5
AGG adalah singkatan dari Anti-grain geometry engine.
Ketenangan
5
matplotlib.use('Agg')bekerja untuk saya - berjalan di dalam gambar Docker.
Mattia Paterna
Yang ini memecahkan masalah saya. Saya menggunakan VM cloud Google, semoga ini membantu orang-orang memiliki masalah yang sama.
Demo
76

Anda dapat menyelesaikannya dengan menambahkan dua baris ini di awal SANGAT skrip .py Anda.

import matplotlib
matplotlib.use('Agg')

PS: Kesalahan akan tetap ada jika dua baris ini tidak ditambahkan di awal kode sumber.

Qihui
sumber
17
Seharusnya di awal kode. Ini penting.
pemburu
ini berfungsi saat dijalankan matplotlibpada buruh pelabuhan (tidak ada tampilan terpasang), tetapi apa fungsinya sebenarnya?
loretoparisi
Ini berfungsi untuk saya ketika saya baru saja menjalankan konsol python pada vm saya, tetapi kode yang sama gagal dengan kesalahan yang sama persis pada vm yang sama ketika bagian dari aplikasi yang berjalan.
rschwieb
Tetapi mengubah backend dari TkAgg ke Agg dalam file konfigurasi berhasil.
rschwieb
41

Untuk menambahkan jawaban, saya menggunakan ini di awal skrip yang diperlukan. Jadi itu berjalan dengan lancar di lingkungan yang berbeda.

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

Karena saya tidak ingin itu selalu menggunakan 'Agg'backend, hanya ketika itu akan melalui Travis CI misalnya.

Sylhare
sumber
4
Solusi ini memiliki nilai tambah untuk menjadi yang paling tidak mengganggu dengan konfigurasi pribadi apa pun yang dimilikinya. Itu harus lebih tinggi.
jaumebonet
11

Saya memiliki masalah yang sama mencoba menjalankan aplikasi tkinter sederhana jarak jauh pada Raspberry Pi. Dalam kasus saya, saya memang ingin menampilkan GUI tkinter pada layar pi, tetapi saya ingin dapat mengeksekusinya melalui SSH dari mesin host saya. Saya juga tidak menggunakan matplotlib, jadi itu bukan penyebab masalah saya. Saya dapat menyelesaikan masalah ini dengan mengatur variabel lingkungan DISPLAY seperti yang disarankan oleh perintah:

export DISPLAY=:0.0

Penjelasan yang baik tentang apa yang dilakukan variabel lingkungan tampilan dan mengapa sintaksnya sangat aneh dapat ditemukan di sini: /ubuntu/432255/what-is-display-environment-variable

ajgriese
sumber
18
Saya mencoba untuk menyimpan plot dengan python dan matplotlib.pyplot menjalankan ssh ... melakukan ini membuat saya: _tkinter.TclError: tidak dapat terhubung untuk menampilkan ": 0.0"
mrk
2

Solusi lain adalah menginstal Xvfb, dan ekspor tampilan Anda ke sana. yaitu:

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

Kemudian

$ export DISPLAY =: 8

$ ./example.py

Joseph
sumber
1

Saya juga menemui masalah ini saat menggunakan Xshell untuk menghubungkan server Linux.

Setelah mencari metode, saya menemukan Xming + Xshell untuk memecahkan masalah imshow gambar dengan matplotlib.

Jika solusi yang dihapus tidak dapat menyelesaikan masalah Anda, coba unduh Xming dalam kondisi Anda menggunakan Xshell. Kemudian atur atribut dalam Xshell, SSH-> tunnel-> X11transfer-> pilih X DISPLAY localhost: 0,0

Mode
sumber
1

Untuk melihat gambar, plot, dan apa pun yang ditampilkan di windows pada mesin jarak jauh Anda, Anda perlu menghubungkannya seperti ini:

ssh -X user@hostname

Dengan begitu Anda mengaktifkan akses ke server X. Server X adalah program dalam Sistem X Window yang berjalan pada mesin lokal (yaitu, komputer yang digunakan langsung oleh pengguna) dan menangani semua akses ke kartu grafis, layar tampilan dan perangkat input (biasanya keyboard dan mouse) pada komputer tersebut .

Info lebih lanjut di sini .

tsveti_iko
sumber