python - with - set xlabel matplotlib
Problema al ejecutar python/matplotlib en el fondo después de finalizar la sesión de ssh (4)
Creo que tu backend matplotlib requiere X11. Busque en su archivo matplotlibrc para determinar cuál es su valor predeterminado (del error, estoy apostando TkAgg). Para ejecutar sin X11, use el backend Agg. O configúrelo globalmente en el archivo matplotlibrc o en un script por script agregando esto al programa python:
import matplotlib
matplotlib.use(''Agg'')
Tengo que VPN y luego ssh desde mi casa a mi servidor de trabajo y quiero ejecutar una secuencia de comandos python en segundo plano, luego desconectarme de la sesión ssh. Mi script hace varios gráficos de histograma usando matplotlib, y mientras mantengo la conexión abierta, todo está bien, pero si cierro la sesión sigo recibiendo un mensaje de error en el archivo de registro que creé para el script.
File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 2058, in loglog
ax = gca()
File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 582, in gca
ax = gcf().gca(**kwargs)
File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 276, in gcf
return figure()
File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 254, in figure
**kwargs)
File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
window = Tk.Tk()
File "/Home/eud/jmcohen/.local/lib/python2.5/lib-tk/Tkinter.py", line 1647, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn''t connect to display "localhost:10.0"
Supongo que no sabe dónde crear las cifras que quiero ya que cierro mi sesión X11 ssh. Si estoy conectado mientras el script se está ejecutando, no veo ninguna figura emergente (aunque eso se debe a que no tengo el comando show () en mi script), y pensé que python usa tkinter para mostrar las cifras. La forma en que estoy creando las figuras es
loglog()
hist(list,x)
ylabel(''y'')
xlabel(''x'')
savefig(''%s_hist.ps'' %source.name)
close()
El script requiere una entrada inicial, por lo que la forma en que lo estoy ejecutando en segundo plano es
python scriptToRun.py << start>& logfile.log&
¿Hay alguna forma de evitar esto, o simplemente tengo que permanecer ssh''d en mi máquina?
Gracias.
Disculpe si esta es una respuesta estúpida, pero si solo está ejecutando una sesión de consola, ¿la pantalla no sería suficiente? Sesiones desmontables, etc.
Parece que está ejecutando en modo interactivo de forma predeterminada, por lo que matplotlib quiere trazar todo en la pantalla primero, lo que por supuesto no puede hacer.
Intenta poner
ioff()
en la parte superior de tu script, junto con hacer que el back-end cambie.
referencia: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.ioff
Si está ejecutando un sistema operativo * nix, el problema es que su sesión finaliza y todos los procesos que requieren una sesión también finalizan cuando se desconecta. Más específicamente, todos sus procesos reciben un SIGHUP (interrupción de la señal). El manejo predeterminado de SITHUP es terminar el proceso. Si desea que su script continúe, debe ignorar la señal. La forma más fácil de hacerlo es asumiendo que comienzas tu script a través de la línea de comando para ejecutarlo usando el comando nohup:
nohup python scriptToRun.py << start>& logfile.log&
nohup normalmente envía un error estándar y un error estándar al archivo nohup.out en el directorio actual. Como ya está redireccionando, no se creará ninguna salida nohup.out.