Ik voer een eenvoudig python-script uit op de server:
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)
Ik probeer de opdracht python example.py
te gebruiken op deze server waarop matplotlib 1.5.1 is geïnstalleerd, het mislukt met de fout:
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
Wat gebeurt hier?
Antwoord 1, autoriteit 100%
Matplotlib kiest standaard de Xwindows-backend.
U moet matplotlib instellen om de Xwindows-backend niet te gebruiken.
Voeg deze code toe aan het begin van uw script (voordat u pyplot importeert) en probeer het opnieuw:
import matplotlib
matplotlib.use('Agg')
Of voeg toe aan .config/matplotlib/matplotlibrc
regel backend: Agg
om niet-interactieve backend te gebruiken.
echo "backend: Agg" > ~/.config/matplotlib/matplotlibrc
Of gebruik bij verbinding met de server de opdracht ssh -X remoteMachine
om Xwindows te gebruiken.
U kunt ook proberen om display: export DISPLAY=mymachine.com:0.0
te exporteren.
Voor meer info: https://matplotlib. org/faq/howto_faq.html#matplotlib-in-a-web-application-server
Antwoord 2, autoriteit 26%
Je kunt het oplossen door deze twee regels toe te voegen aan het VERY begin van je .py-script.
import matplotlib
matplotlib.use('Agg')
PS: De fout blijft bestaan als deze twee regels niet helemaal aan het begin van de broncode worden toegevoegd.
Antwoord 3, autoriteit 16%
Om het antwoord op te tellen, heb ik dit aan het begin van het benodigde script gebruikt. Het werkt dus soepel in verschillende omgevingen.
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
Omdat ik niet wilde dat het altijd de backend 'Agg'
zou gebruiken, alleen als het bijvoorbeeld via Travis CI zou gaan.
Antwoord 4, autoriteit 4%
Ik had hetzelfde probleem toen ik een eenvoudige tkinter-app op afstand probeerde uit te voeren op een Raspberry Pi. In mijn geval wilde ik de tkinter-GUI op het pi-display weergeven, maar ik wil het via SSH vanaf mijn hostmachine kunnen uitvoeren. Ik gebruikte ook geen matplotlib, dus dat was niet de oorzaak van mijn probleem. Ik heb het probleem kunnen oplossen door de omgevingsvariabele DISPLAY in te stellen zoals de fout suggereert met het commando:
export DISPLAY=:0.0
Een goede uitleg van wat de display-omgevingsvariabele doet en waarom de syntaxis zo vreemd is, vindt u hier: https://askubuntu.com/questions/432255/what-is-display-environment-variable
Antwoord 5, autoriteit 2%
Een andere oplossing is om Xvfb te installeren en uw beeldscherm ernaar te exporteren.
dat wil zeggen:
disp=:8
screen=0
geom=640x480x24
exec Xvfb $disp -screen $screen $geom 2>/tmp/Xvfb.log &
Dan
$ export DISPLAY=:8
$ ./voorbeeld.py
Antwoord 6
Om afbeeldingen, plots en alles wat op vensters op uw externe computer wordt weergegeven te zien, moet u er als volgt verbinding mee maken:
ssh -X [email protected]
Op die manier schakel je de toegang tot de X-server in. De X-server is een programma in het X Window-systeem dat draait op lokale machines (dwz de computers die rechtstreeks door gebruikers worden gebruikt) en zorgt voor alle toegang tot de grafische kaarten, beeldschermen en invoerapparaten (meestal een toetsenbord en muis) op die computers .
Meer info hier.
Antwoord 7
Ik heb dit probleem ook ondervonden toen ik Xshell gebruikte om verbinding te maken met de Linux-server.
Na het zoeken naar methoden, vind ik Xming + Xshell om het imshow-probleem met afbeeldingen op te lossen met matplotlib.
Als bovenstaande oplossingen uw probleem niet kunnen oplossen, probeer dan Xming te downloaden onder de voorwaarde dat u Xshell gebruikt. Stel vervolgens het attribuut in Xshell in, SSH->tunnel->X11transfer->kies X DISPLAY localhost:0.0
Antwoord 8
Ik wil hier een antwoord toevoegen dat niemand expliciet heeft aangegeven met implementatie.
Dit is een geweldige bron om naar te verwijzen voor deze fout:
https://matplotlib.org/faq/usage_faq.html
In mijn geval werkte het gebruik van matplotlib.use
niet omdat het op de een of andere manier al ergens anders was ingesteld. Ik was echter in staat om voorbij de fout te komen door een omgevingsvariabele te definiëren:
export MPLBACKEND=Agg
Dit lost het probleem op.
Mijn fout zat specifiek in een CircleCI-stroom en dit loste de mislukte tests op. Een raar ding was dat mijn tests zouden slagen als ze werden uitgevoerd met behulp van pytest
, maar zouden mislukken als ze parallelism
samen met de functie circleci tests split
zouden gebruiken. Door deze env-variabele te declareren is het probleem echter opgelost.
Antwoord 9
Ik zag het op Colab en de volgende coderegels losten het op.
Zet het aan het begin van het notitieboek.
Referentie
### CREATE VIRTUAL DISPLAY ###
!apt-get install -y xvfb # Install X Virtual Frame Buffer
import os
os.system('Xvfb :1 -screen 0 1600x1200x16 &') # create virtual display with size 1600x1200 and 16 bit color. Color can be changed to 24 or 8
os.environ['DISPLAY']=':1.0' # tell X clients to use our virtual DISPLAY :1.0.
%matplotlib inline
### INSTALL GHOSTSCRIPT (Required to display NLTK trees) ###
!apt install ghostscript python3-tk