_tkinter.TclError: ไม่มีชื่อที่แสดงและไม่มีตัวแปรสภาพแวดล้อม $ DISPLAY


197

ฉันกำลังใช้งานสคริปต์หลามอย่างง่ายในเซิร์ฟเวอร์:

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 หรือไม่
Padraic Cunningham

8
... โดยไม่-X?
Klaus D.

1
หากคุณเรียกใช้บนสมุดบันทึก Jupyter ให้เรียกใช้คำสั่งนี้บนสมุดบันทึก%matplotlib inline
GoingMyWay

หากคุณเชื่อมต่อจากเครื่อง Win ไปยังเซิร์ฟเวอร์ระยะไกลผ่าน putty คุณต้องติดตั้ง Xming เพื่อส่งต่อ X11
Serenity

คำตอบ:


296

Matplotlib เลือก Xwindows แบ็กเอนด์ตามค่าเริ่มต้น คุณต้องตั้งค่า matplotlib เพื่อไม่ให้ใช้แบ็กเอนด์ Xwindows

เพิ่มรหัสนี้เพื่อเริ่มต้นสคริปต์ของคุณ ( ก่อนนำเข้า pyplot ) และลองอีกครั้ง:

import matplotlib
matplotlib.use('Agg')

หรือเพิ่มใน.config/matplotlib/matplotlibrcบรรทัดbackend: Aggเพื่อใช้แบ็กเอนด์ที่ไม่มีการโต้ตอบ

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

หรือเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ให้ใช้ssh -X remoteMachineคำสั่งเพื่อใช้ Xwindows

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

5
AGG ย่อมาจากเอ็นจิ้นเรขาคณิตต่อต้านเม็ด
Serenity

5
matplotlib.use('Agg')ทำงานได้สำหรับฉัน - ทำงานภายในภาพนักเทียบท่า
Mattia Paterna

อันนี้แก้ปัญหาของฉันได้ ฉันทำงานบน Google Cloud VMs หวังว่าสิ่งนี้จะช่วยให้ผู้คนมีปัญหาเดียวกัน
สาธิต

76

คุณสามารถแก้ได้โดยการเพิ่มทั้งสองสายในมากจุดเริ่มต้นของสคริปต์ .py ของคุณ

import matplotlib
matplotlib.use('Agg')

PS: ข้อผิดพลาดจะยังคงอยู่หากไม่เพิ่มสองบรรทัดนี้ในส่วนเริ่มต้นของซอร์สโค้ด


17
มันควรจะอยู่ในจุดเริ่มต้นของรหัส นี้เป็นสิ่งสำคัญ.
นักล่า

สิ่งนี้ทำงานได้เมื่อทำงานmatplotlibกับนักเทียบท่า (ไม่ได้ติดตั้งจอแสดงผล) แต่มันทำอะไรได้จริง?
loretoparisi

สิ่งนี้ใช้ได้กับฉันเมื่อฉันเพิ่งเรียกใช้คอนโซลหลามบน vm ของฉัน แต่รหัสเดียวกันที่แน่นอนล้มเหลวด้วยข้อผิดพลาดเดียวกันที่แน่นอนใน 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

เพราะฉันไม่ต้องการให้เป็น alsways โดยใช้'Agg'แบ็กเอนด์เฉพาะเมื่อมันผ่าน Travis CI เท่านั้น


4
โซลูชันนี้มีมูลค่าเพิ่มที่จะรบกวนน้อยที่สุดกับสิ่งใดก็ตามที่มีการกำหนดค่าส่วนบุคคล มันควรจะสูงกว่า
jaumebonet

11

ฉันมีปัญหาเดียวกันนี้ที่พยายามเรียกใช้แอพ tkinter อย่างง่าย ๆ จาก Raspberry Pi ในกรณีของฉันฉันต้องการแสดง tkinter GUI บนจอแสดงผล pi แต่ฉันต้องการที่จะสามารถเรียกใช้มันผ่าน SSH จากเครื่องโฮสต์ของฉัน ฉันยังไม่ได้ใช้ matplotlib ดังนั้นจึงไม่ใช่สาเหตุของปัญหาของฉัน ฉันสามารถแก้ไขปัญหาโดยการตั้งค่าตัวแปรสภาพแวดล้อม DISPLAY เป็นข้อผิดพลาดที่แนะนำด้วยคำสั่ง:

export DISPLAY=:0.0

คำอธิบายที่ดีเกี่ยวกับสิ่งที่ตัวแปรสภาวะแวดล้อมการแสดงผลกำลังทำอยู่และทำไมไวยากรณ์จึงแปลกมากสามารถพบได้ที่นี่: /ubuntu/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 &

แล้วก็

$ export DISPLAY =: 8

$ ./example.py


1

ฉันยังพบปัญหานี้ในขณะที่ใช้ Xshell เพื่อเชื่อมต่อเซิร์ฟเวอร์ Linux

หลังจาก seaching สำหรับวิธีการฉันพบ Xming + Xshell เพื่อแก้ไขปัญหา imshow ภาพด้วย matplotlib

หากวิธีแก้ปัญหาที่ไม่สามารถแก้ไขปัญหาของคุณได้เพียงลองดาวน์โหลด Xming ภายใต้เงื่อนไขที่คุณใช้ Xshell จากนั้นตั้งค่าแอตทริบิวต์ใน Xshell, SSH-> tunnel-> X11transfer-> เลือก X DISPLAY localhost: 0.0


1

ในการดูภาพแปลงและสิ่งต่าง ๆ ที่แสดงบน windows บนเครื่องระยะไกลคุณต้องเชื่อมต่อกับมันดังนี้:

ssh -X user@hostname

วิธีการที่คุณเปิดใช้งานการเข้าถึงเซิร์ฟเวอร์ X เซิร์ฟเวอร์ X เป็นโปรแกรมในระบบ X Window ที่ทำงานบนเครื่องท้องถิ่น (เช่นคอมพิวเตอร์ที่ผู้ใช้ใช้โดยตรง) และจัดการการเข้าถึงกราฟิกการ์ดหน้าจอแสดงผลและอุปกรณ์อินพุต (โดยทั่วไปคือแป้นพิมพ์และเมาส์) บนคอมพิวเตอร์เหล่านั้น .

ข้อมูลเพิ่มเติมที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.