_tkinter.TclError: कोई प्रदर्शन नाम और कोई $ प्रदर्शन पर्यावरण चर नहीं


195

मैं सर्वर में एक साधारण अजगर स्क्रिप्ट चला रहा हूं:

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.pyइस सर्वर में कमांड का उपयोग करने की कोशिश करता हूं जिसमें matplotlib 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 पर चला रहे हैं?
पादरिक कनिंघम

8
... बिना -X?
क्लॉस डी।

1
यदि आप इसे Jupyter नोटबुक पर चलाते हैं, तो नोटबुक पर इस कमांड को %matplotlib inline
चलाएं

यदि आप विन मशीन से रिमोट सर्वर से कनेक्ट करते हैं तो पोटीन के माध्यम से आपको X11 फॉरवर्ड X11 को स्थापित करना होगा।
Serenity

जवाबों:


295

Matplotlib डिफ़ॉल्ट रूप से Xwindows बैकएंड चुनता है। आपको Xwindows बैकएंड का उपयोग नहीं करने के लिए matplotlib सेट करने की आवश्यकता है।

अपनी स्क्रिप्ट की शुरुआत में इस कोड को जोड़ें ( pyplot आयात करने से पहले ) और फिर कोशिश करें:

import matplotlib
matplotlib.use('Agg')

या गैर-संवादात्मक बैकएंड का उपयोग करने के लिए .config/matplotlib/matplotlibrcलाइन में जोड़ें backend: 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
वास्तव में 'एग' क्या है?
CKM

5
AGG एंटी-ग्रेन ज्यामिति इंजन का संक्षिप्त नाम है।
शांति

5
matplotlib.use('Agg')मेरे लिए काम करता है - एक डॉकर छवि के अंदर चल रहा है।
मटिया पटेना

इसने मेरी समस्या हल कर दी। मैं Google क्लाउड VMs पर चल रहा हूं, आशा करता हूं कि इससे लोगों को समान समस्या होगी।
डेमो

76

आप में इन दो पंक्तियों को जोड़ कर इसे हल कर सकते बहुत अपने .py स्क्रिप्ट की शुरुआत।

import matplotlib
matplotlib.use('Agg')

PS: त्रुटि तब भी मौजूद रहेगी जब स्रोत कोड की शुरुआत में इन दो लाइनों को नहीं जोड़ा जाता है।


17
यह कोड की बहुत शुरुआत में होना चाहिए। यह महत्वपूर्ण है।
शिकारी

यह काम कर रहा है जब matplotlibdocker (कोई प्रदर्शन संलग्न नहीं) पर चल रहा है , लेकिन यह वास्तव में क्या करता है?
लॉरेटोपरसी

मेरे लिए यह तब काम करता है जब मैं सिर्फ अपने vm पर python कंसोल चलाता हूं, लेकिन सटीक एक ही कोड एक ही vm पर ठीक उसी त्रुटि के साथ विफल होता है जब रनिंग एप्लिकेशन का हिस्सा होता है।
rschwieb

लेकिन विन्यास फाइल में TkAgg से Agg के बैकएंड को बदलने का काम किया।
rschwieb

42

उत्तर पर जोड़ने के लिए, मैंने आवश्यक स्क्रिप्ट की शुरुआत में इसका उपयोग किया। इसलिए यह विभिन्न वातावरणों पर आसानी से चलता है।

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'बैकएंड का उपयोग करते हुए , जब यह उदाहरण के लिए ट्रैविस सीआई के माध्यम से जाएगा।


4
इस समाधान में जो कुछ भी व्यक्तिगत कॉन्फ़िगरेशन के साथ कम से कम एक घुसपैठ करने के लिए जोड़ा गया मूल्य है। यह अधिक होना चाहिए।
jaumebonet

11

मेरे पास यह वही मुद्दा था जो एक रास्पबेरी पाई पर दूरस्थ रूप से एक साधारण टिंकर ऐप चलाने की कोशिश कर रहा था। मेरे मामले में, मैं पीआई डिस्प्ले पर टिंकर जीयूआई प्रदर्शित करना चाहता था, लेकिन मैं अपने होस्ट मशीन से एसएसएच पर इसे निष्पादित करने में सक्षम होना चाहता हूं। मैं भी matplotlib का उपयोग नहीं कर रहा था, इसलिए यह मेरे मुद्दे का कारण नहीं था। मैं कमांड के साथ त्रुटि सुझाव के रूप में प्रदर्शन पर्यावरण चर सेट करके समस्या को हल करने में सक्षम था:

export DISPLAY=:0.0

प्रदर्शन पर्यावरण चर क्या कर रहा है और वाक्यविन्यास इतना विषम क्यों है की एक अच्छी व्याख्या यहाँ मिल सकती है: /ubuntu/432255/what-is-display-environment-variable


18
मैं ssh पर चल रहे अजगर और matplotlib.pyplot के साथ प्लॉट बचाने की कोशिश कर रहा हूं ... ऐसा करने से मुझे यह मिलता है: _tkinter.TclError: डिस्प्ले से कनेक्ट नहीं हो सका ": 0.0"
mrk

2

एक अन्य समाधान Xvfb को स्थापित करना है, और अपने प्रदर्शन को इसके लिए निर्यात करना है। अर्थात:

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

फिर

$ निर्यात प्रदर्शन =: 8

$ ./example.py


1

लिनक्स सर्वर को जोड़ने के लिए Xshell का उपयोग करते समय मैंने इस समस्या को भी पूरा किया।

तरीकों के लिए खोज करने के बाद, मुझे मैटलपोटलिब के साथ इमेज इमशो प्रॉब्लम को हल करने के लिए Xming + Xshell मिला।

यदि हल किए गए समाधान आपकी समस्या को हल नहीं कर सकते हैं, तो बस उस स्थिति के तहत Xming को डाउनलोड करने का प्रयास करें जिसे आप Xshell का उपयोग कर रहे हैं। फिर Xshell, SSH-> सुरंग-> X11transfer-> X DISPLAY में चुनें विशेषता सेट करें : 0: 0.0


1

अपनी दूरस्थ मशीन पर छवियों, भूखंडों और खिड़कियों पर प्रदर्शित कुछ भी देखने के लिए आपको इसे इस तरह से कनेक्ट करने की आवश्यकता है:

ssh -X user@hostname

इस तरह आप X सर्वर तक पहुँच को सक्षम करते हैं। एक्स सर्वर एक्स विंडो सिस्टम में एक प्रोग्राम है जो स्थानीय मशीनों (यानी, उपयोगकर्ताओं द्वारा सीधे उपयोग किए जाने वाले कंप्यूटर) पर चलता है और उन कंप्यूटरों पर ग्राफिक्स कार्ड, डिस्प्ले स्क्रीन और इनपुट डिवाइस (आमतौर पर एक कीबोर्ड और माउस) तक सभी पहुंच को संभालता है। ।

अधिक जानकारी यहाँ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.