_tkinter.TclError: không có tên hiển thị và không có biến môi trường $ HIỂN THỊ


193

Tôi đang chạy một kịch bản python đơn giản trong máy chủ:

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)

Tôi cố gắng sử dụng lệnh python example.pytrong máy chủ này đã cài đặt matplotlib 1.5.1 nhưng không thành công với lỗi:

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

Chuyện gì đang xảy ra ở đây?


10
Bạn đang chạy này trên ssh?
Padraic Cickyham

8
... Không có -X?
Klaus D.

1
Nếu bạn chạy nó trên máy tính xách tay Jupyter, hãy chạy lệnh này trên máy tính xách tay%matplotlib inline
Đi MYWay

Nếu bạn kết nối từ máy Win đến máy chủ từ xa thông qua putty, bạn phải cài đặt Xming để chuyển tiếp X11.
thanh thản

Câu trả lời:


291

Matplotlib chọn phụ trợ Xwindows theo mặc định. Bạn cần đặt matplotlib để không sử dụng phụ trợ Xwindows.

Thêm mã này vào đầu tập lệnh của bạn ( trước khi nhập pyplot ) và thử lại:

import matplotlib
matplotlib.use('Agg')

Hoặc thêm vào .config/matplotlib/matplotlibrcdòng backend: Aggđể sử dụng phụ trợ không tương tác.

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

Hoặc khi kết nối với máy chủ sử dụng ssh -X remoteMachine lệnh để sử dụng Xwindows.

Ngoài ra, bạn có thể thử xuất màn hình: export DISPLAY=mymachine.com:0.0 .

Để biết thêm thông tin: https://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server


13
'ssh -X remoteMachine' đã giải quyết vấn đề của tôi. Cảm ơn bạn!
dùng3654307

6
'Agg' trong thực tế là gì?
CKM

5
AGG là tên viết tắt của công cụ hình học Anti-Grain.
thanh thản

5
matplotlib.use('Agg')hoạt động với tôi - chạy bên trong hình ảnh Docker.
Mattia Paterna

Điều này đã giải quyết vấn đề của tôi. Tôi đang chạy trên máy ảo đám mây của Google, hy vọng điều này sẽ giúp mọi người có cùng một vấn đề.
Demo

76

Bạn có thể giải quyết nó bằng cách thêm hai dòng này vào đầu RẤT của tập lệnh .py của bạn.

import matplotlib
matplotlib.use('Agg')

PS: Lỗi vẫn sẽ tồn tại nếu hai dòng này không được thêm vào ngay từ đầu mã nguồn.


17
Nó nên ở ngay từ đầu của mã. Điều này quan trọng.
thợ săn

Điều này hoạt động khi chạy matplotlibtrên docker (không có màn hình kèm theo), nhưng thực tế nó làm gì?
loretoparisi

Điều này hoạt động với tôi khi tôi chỉ chạy giao diện điều khiển python trên vm của mình, nhưng mã chính xác bị lỗi với cùng một lỗi chính xác trên cùng một vm khi một phần của ứng dụng đang chạy.
rschwieb

Nhưng việc thay đổi phụ trợ từ TkAgg thành Agg trong tệp cấu hình đã làm nên điều khó khăn.
rschwieb

41

Để thêm vào câu trả lời, tôi đã sử dụng nó ở phần đầu của kịch bản cần thiết. Vì vậy, nó chạy trơn tru trên các môi trường khác nhau.

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

Bởi vì tôi không muốn nó được sử dụng 'Agg'phụ trợ, chỉ khi nó đi qua Travis CI chẳng hạn.


4
Giải pháp này có giá trị gia tăng là ít xâm phạm nhất với bất kỳ cấu hình cá nhân nào có. Nó nên cao hơn.
jaumebonet

11

Tôi gặp vấn đề tương tự khi cố chạy một ứng dụng tkinter đơn giản từ xa trên Raspberry Pi. Trong trường hợp của tôi, tôi đã muốn hiển thị GUI tkinter trên màn hình pi, nhưng tôi muốn có thể thực thi nó qua SSH từ máy chủ của mình. Tôi cũng không sử dụng matplotlib, vì vậy đó không phải là nguyên nhân của vấn đề của tôi. Tôi đã có thể giải quyết vấn đề bằng cách đặt biến môi trường HIỂN THỊ như lỗi gợi ý với lệnh:

export DISPLAY=:0.0

Một lời giải thích tốt về những gì biến môi trường hiển thị đang làm và tại sao cú pháp quá kỳ lạ có thể được tìm thấy ở đây: https://askubfox.com/questions/432255/what-is-display-envir-variable


18
Tôi đang cố gắng lưu các lô với python và matplotlib.pyplot chạy qua ssh ... làm điều này giúp tôi: _tkinter.TclError: không thể kết nối để hiển thị ": 0.0"
mrk

2

Một giải pháp khác là cài đặt Xvfb và xuất màn hình của bạn sang nó. I E:

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

Sau đó

$ xuất khẩu HIỂN THỊ =: 8

$ ./example.py


1

Tôi cũng gặp vấn đề này khi sử dụng Xshell để kết nối máy chủ Linux.

Sau khi tìm kiếm các phương thức, tôi tìm Xming + Xshell để giải quyết vấn đề imshow hình ảnh với matplotlib.

Nếu các giải pháp nêu trên không thể giải quyết vấn đề của bạn, chỉ cần thử tải xuống Xming với điều kiện bạn đang sử dụng Xshell. Sau đó đặt thuộc tính trong Xshell, SSH-> đường hầm-> X11transfer-> chọn X HIỂN THỊ localhost: 0.0


1

Để xem hình ảnh, lô và bất cứ thứ gì được hiển thị trên các cửa sổ trên máy từ xa của bạn, bạn cần kết nối với nó như thế này:

ssh -X user@hostname

Bằng cách đó bạn cho phép truy cập vào máy chủ X. Máy chủ X là một chương trình trong Hệ thống X Window chạy trên các máy cục bộ (nghĩa là các máy tính được người dùng sử dụng trực tiếp) và xử lý tất cả quyền truy cập vào card đồ họa, màn hình hiển thị và thiết bị đầu vào (thường là bàn phím và chuột) trên các máy tính đó .

Thêm thông tin ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.