_tkinter.TclError: görünen ad yok ve $ DISPLAY ortam değişkeni yok


197

Sunucuda basit bir python komut dosyası çalıştırıyorum:

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)

Ben python example.pyyüklü matplotlib 1.5.1 yüklü olan bu sunucuda komutu kullanmaya çalışın hatayla başarısız:

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

Burada ne oluyor?


10
Bunu ssh üzerinden mi geçiriyorsun?
Padraic Cunningham

8
... olmadan -X?
Klaus

1
Jupyter dizüstü bilgisayarda çalıştırırsanız, bu komutu dizüstü bilgisayarda çalıştırın%matplotlib inline
GoingMyWay

Win makineden macun ile uzak sunucuya bağlanırsanız, X11'i iletmek için Xming'i yüklemeniz gerekir.
Serenity

Yanıtlar:


297

Matplotlib varsayılan olarak Xwindows arka ucunu seçer. Xwindows arka ucunu kullanmamak için matplotlib ayarlamanız gerekir.

Bu kodu komut dosyanızın başına ( pyplot'u içe aktarmadan önce ) ekleyin ve tekrar deneyin:

import matplotlib
matplotlib.use('Agg')

Veya etkileşimli olmayan arka uç kullanmak için .config/matplotlib/matplotlibrcsatıra ekleyin backend: Agg.

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

Veya sunucuya bağlandığında ssh -X remoteMachineXwindows kullanmak için komut kullanın.

Ayrıca ihracat ekrana deneyebilirsiniz: export DISPLAY=mymachine.com:0.0.

Daha fazla bilgi için: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server


13
'ssh -X remoteMachine' sorunumu çözdü. Teşekkür ederim!
user3654307

6
aslında 'Agg' nedir?
CKM

5
AGG, Tahıl önleyici geometri motorunun kısaltmasıdır.
Serenity

5
matplotlib.use('Agg')benim için çalışıyor - Docker görüntüsünün içinde çalışıyor.
Mattia Paterna

Bu benim sorunumu çözdü. Google bulut sanal makinelerinde çalışıyorum, umarım bu insanların aynı sorunu yaşamalarına yardımcı olur.
Demo

76

Bu iki satırı .py komut dosyanızın ÇOK başlangıcına ekleyerek çözebilirsiniz .

import matplotlib
matplotlib.use('Agg')

Not: Bu iki satır kaynak kodunun en başına eklenmezse hata yine de devam eder.


17
Kodun başlangıcında olmalıdır. Bu önemli.
avcı

bu matplotlibdocker üzerinde çalışırken (ekran takılı değil) çalıştı , ama aslında ne işe yarıyor?
loretoparisi

Benim vm üzerinde sadece python konsolunu çalıştırdığımda bu benim için çalışır, ancak aynı uygulamanın aynı vm üzerinde tam olarak aynı hatayla başarısız olur.
rschwieb

Ancak yapılandırma dosyasında arka ucu TkAgg'dan Agg'ye değiştirmek hile yaptı.
rschwieb

42

Cevaba eklemek için bunu gerekli betiğin başında kullandım. Böylece farklı ortamlarda sorunsuz çalışır.

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

Çünkü 'Agg'arka ucunu her zaman kullanmasını istemedim , sadece Travis CI'den geçtiği zaman.


4
Bu çözüm, kişisel yapılandırmaya sahip olan en az müdahaleci olmak için katma değere sahiptir. Daha yüksek olmalı.
jaumebonet

11

Ahududu Pi üzerinde uzaktan basit bir tkinter uygulamasını çalıştırmaya çalışırken de aynı sorunu yaşadım. Benim durumumda pi ekranda tkinter GUI'yi görüntülemek istedim, ancak ana bilgisayarımdan SSH üzerinden yürütmek istiyorum. Ben de matplotlib kullanmıyordum, bu yüzden sorunumun nedeni bu değildi. Hata komut ile önerdiği gibi DISPLAY ortam değişkeni ayarlayarak sorunu çözmek mümkün:

export DISPLAY=:0.0

Görüntüleme ortamı değişkeninin ne yaptığına ve sözdiziminin neden bu kadar garip olduğuna dair iyi bir açıklama burada bulunabilir: /ubuntu/432255/what-is-display-environment-variable


18
Bunu yaparken ... ssh üzerinden çalışan piton ve matplotlib.pyplot ile araziler kurtarmaya çalışıyorum beni alır: _tkinter.TclError: Ekrandaki bağlanamadı ": 0.0"
Mrk

2

Başka bir çözüm Xvfb'yi kurmak ve ekranınızı ona aktarmaktır. yani:

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

Sonra

$ export DISPLAY =: 8

$ ./example.py


1

Linux sunucusuna bağlanmak için Xshell kullanırken de bu sorunla karşılaştım.

Yöntemleri araştırdıktan sonra, matplotlib ile görüntü imshow problemini çözmek için Xming + Xshell'i buluyorum.

Yukarıdaki çözümler sorununuzu çözemezse, Xshell'i kullandığınız koşulda Xming'i indirmeyi deneyin. Sonra özniteliği Xshell, SSH-> tünel-> X11transfer-> olarak seçin X DISPLAY yerel ana bilgisayarını seçin: 0.0


1

Uzak makinenizdeki pencerelerde görüntülenen görüntüleri, grafikleri ve herhangi bir şeyi görebilmek için buna şu şekilde bağlamanız gerekir:

ssh -X user@hostname

Bu şekilde X sunucusuna erişimi etkinleştirirsiniz. X sunucusu, X Pencere Sisteminde yerel makinelerde (yani doğrudan kullanıcılar tarafından kullanılan bilgisayarlar) çalışan ve bu bilgisayarlardaki grafik kartlarına, ekranlara ve giriş cihazlarına (genellikle bir klavye ve fare) tüm erişimi yöneten bir programdır. .

Daha fazla bilgi burada .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.