_tkinter.TclError: কোনও প্রদর্শনের নাম এবং কোনও $ DISPLAY পরিবেশ পরিবর্তনশীল


194

আমি সার্ভারে একটি সাধারণ অজগর স্ক্রিপ্ট চালাচ্ছি:

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এই সার্ভারে কমান্ডটি ব্যবহার করার চেষ্টা করব যা ম্যাটপ্ল্লোব 1.5.5 ইনস্টল করেছে এটি ত্রুটি সহ ব্যর্থ হয়:

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
আপনি যদি এটি জপিটার নোটবুকটিতে চালনা করেন তবে নোটবুকটিতে এই %matplotlib inline
আদেশটিটি

আপনি পুট্টির মাধ্যমে উইন মেশিন থেকে রিমোট সার্ভারের সাথে সংযোগ স্থাপন করলে আপনাকে এক্স 11 ফরওয়ার্ড করার জন্য জিমিং ইনস্টল করতে হবে।
নিখরচায়

উত্তর:


294

ম্যাটপ্লটলিব পূর্বনির্ধারিতভাবে উইন্ডো ব্যাকএন্ড চয়ন করে। এক্স উইন্ডোজ ব্যাকএন্ড ব্যবহার না করতে আপনাকে ম্যাটপ্লটলিব সেট করতে হবে।

আপনার স্ক্রিপ্টের শুরুতে এই কোডটি যুক্ত করুন ( পাইপলট আমদানির আগে ) এবং আবার চেষ্টা করুন:

import matplotlib
matplotlib.use('Agg')

অথবা অ-ইন্টারেক্টিভ ব্যাকএন্ড ব্যবহার করতে .config/matplotlib/matplotlibrcলাইনে যুক্ত করুন backend: Agg

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

বা সার্ভারের সাথে সংযুক্ত হওয়ার সময় ssh -X remoteMachineএক্স উইন্ডো ব্যবহার করার জন্য কমান্ড ব্যবহার করুন।

এছাড়াও আপনি রপ্তানি প্রদর্শন করতে চেষ্টা করতে পারে: export DISPLAY=mymachine.com:0.0

আরও তথ্যের জন্য: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server


13
'ssh -X রিমোটম্যাচাইন' আমার সমস্যার সমাধান করেছে। ধন্যবাদ!
user3654307

6
আসলে 'অ্যাগ' আসলে কী?
সিকেএম

5
এজিজি হ'ল অ্যান্টি-গ্রান জ্যামিতি ইঞ্জিনের সংক্ষেপণ।
নির্মলতা

5
matplotlib.use('Agg')আমার জন্য কাজ করে - একটি ডকার চিত্রের অভ্যন্তরে চলছে।
মাতিয়া পাত্তেনা

এটি আমার সমস্যার সমাধান করেছে। আমি গুগল ক্লাউড ভিএমগুলিতে চালিয়ে যাচ্ছি, আশা করি এটি লোকেদের একই সমস্যা করতে সহায়তা করে।
ডেমো

76

আপনার .py স্ক্রিপ্টের খুব শুরুতে এই দুটি লাইন যুক্ত করে আপনি এটি সমাধান করতে পারেন ।

import matplotlib
matplotlib.use('Agg')

পিএস: উত্স কোডের একেবারে গোড়ার দিকে এই দুটি লাইন যুক্ত না করা থাকলে ত্রুটিটি এখনও থাকবে।


17
এটি কোডের খুব প্রথম দিকে হওয়া উচিত। এটা গুরুত্বপূর্ণ.
শিকারি

matplotlibডকারে চলার সময় এটি কাজ করেছিল (কোনও ডিসপ্লে সংযুক্ত নেই) তবে এটি আসলে কী করে?
loretoparisi

এটি আমার পক্ষে কাজ করে যখন আমি কেবল আমার ভিএম এ পাইথন কনসোল চালাই, তবে চলমান অ্যাপ্লিকেশনটির অংশ যখন একই ভিএম তে ঠিক একই ত্রুটিটি সহ একই কোডটি ব্যর্থ হয়।
rschwieb

তবে কনফিগার ফাইলে টেক্সটএজি থেকে এগ্রিতে ব্যাকএন্ড পরিবর্তন করা কৌতুকটি করেছিল।
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'ব্যাকএন্ডটি ব্যবহার করে alsways হয় কেবল তখনই যখন এটি ট্র্যাভিস সিআইয়ের মধ্য দিয়ে যায়।


4
এই সমাধানটিতে ব্যক্তিগত কনফিগারেশন যা আছে তার সাথে স্বল্পতম হস্তক্ষেপযুক্ত হওয়ার অতিরিক্ত মান রয়েছে। এটি আরও বেশি হওয়া উচিত।
jaumebonet

11

আমার এই একই সমস্যাটি একটি রাস্পবেরি পাইতে দূর থেকে একটি সরল টিকিন্টার অ্যাপ্লিকেশন চালানোর চেষ্টা করছিল। আমার ক্ষেত্রে আমি পাই ডিসপ্লেতে টিকিনটার জিইউআই প্রদর্শন করতে চাইনি, তবে আমি এটি আমার হোস্ট মেশিন থেকে এসএসএইচের মাধ্যমে কার্যকর করতে সক্ষম হতে চাই। আমি ম্যাটপ্ল্লোলিবও ব্যবহার করছিলাম না, সুতরাং এটি আমার সমস্যার কারণ ছিল না। কমান্ডটি দিয়ে ত্রুটিটি যেমন প্রস্তাবিত হয় তেমনই আমি DISPLAY পরিবেশ পরিবর্তনশীল সেট করে সমস্যাটি সমাধান করতে সক্ষম হয়েছি:

export DISPLAY=:0.0

ডিসপ্লে এনভায়রনমেন্ট ভেরিয়েবল কী করছে এবং সিনট্যাক্সটি কেন এত অদ্ভুত তা সম্পর্কে একটি ভাল ব্যাখ্যা এখানে পাওয়া যাবে: /ubuntu/432255/hat-is-display-en पर्यावरण- পরিবর্তনশীল


18
আমি পাইথন এবং ম্যাটপ্ল্লোটিব.পিপ্লট এসএসএসের উপর দিয়ে চলমান প্লটগুলি সংরক্ষণ করার চেষ্টা করছি ... এটি করায় আমাকে পাওয়া যায়: _টকিনেটার clএইচক্রিরর: প্রদর্শন করতে সংযোগ করতে পারেনি ": 0.0"
মিঃ

2

আর একটি সমাধান হ'ল এক্সভিএফবি ইনস্টল করা এবং এতে আপনার প্রদর্শন রফতানি করা। অর্থাৎ,

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

তারপর

$ রফতানি DISPLAY =: 8

/ ./example.py


1

লিনাক্স সার্ভারটি সংযোগ করতে এক্সশেল ব্যবহার করার সময়ও আমি এই সমস্যাটি পূরণ করেছি met

পদ্ধতির জন্য সিচিংয়ের পরে, আমি ম্যাটপ্ল্লোলিবের সাথে ইমেজ ইস্যু সমস্যা সমাধানের জন্য এক্সিং + এক্সশেলকে পাই।

যদি উপরের সমাধানগুলি আপনার সমস্যার সমাধান করতে না পারে তবে আপনি এক্স শেল ব্যবহার করছেন সেই শর্তে কেবল জেমিং ডাউনলোড করার চেষ্টা করুন। তারপরে এক্সশেলের এট্রিবিউট সেট করুন, এসএসএইচ-> টানেল-> এক্স 11 ট্রান্সফার-> এক্স ডিসপ্লে লোকালহোস্ট চয়ন করুন: 0.0


1

আপনার দূরবর্তী মেশিনে উইন্ডোতে প্রদর্শিত চিত্র, প্লট এবং যেকোন কিছু দেখার জন্য আপনাকে এটির সাথে এটির সাথে সংযোগ স্থাপন করতে হবে:

ssh -X user@hostname

এইভাবে আপনি এক্স সার্ভারে অ্যাক্সেস সক্ষম করে। এক্স সার্ভারটি এক্স উইন্ডো সিস্টেমে এমন একটি প্রোগ্রাম যা স্থানীয় মেশিনে চালিত হয় (যেমন, ব্যবহারকারীরা সরাসরি ব্যবহার করেন কম্পিউটারগুলি) এবং সেই কম্পিউটারগুলিতে গ্রাফিক্স কার্ড, ডিসপ্লে স্ক্রিন এবং ইনপুট ডিভাইসগুলিতে (সাধারণত একটি কীবোর্ড এবং মাউস) সমস্ত অ্যাক্সেস পরিচালনা করে that ।

আরও তথ্য এখানে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.