Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problem running python/matplotlib in background after ending ssh session

I have to VPN and then ssh from home to my work server and want to run a python script in the background, then log out of the ssh session. My script makes several histogram plots using matplotlib, and as long as I keep the connection open everything is fine, but if I log out I keep getting an error message in the log file I created for the 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" 

I'm assuming that it doesn't know where to create the figures I want since I close my X11 ssh session. If I'm logged in while the script is running I don't see any figures popping up (although that's because I don't have the show() command in my script), and I thought that python uses tkinter to display figures. The way that I'm creating the figures is,

loglog() hist(list,x) ylabel('y') xlabel('x') savefig('%s_hist.ps' %source.name) close() 

The script requires some initial input, so the way I'm running it in the background is

python scriptToRun.py << start>& logfile.log& 

Is there a way around this, or do I just have to stay ssh'd into my machine?

Thanks.

like image 418
Jamie Avatar asked Mar 14 '10 20:03

Jamie


People also ask

How do I keep a python script from running after logging out?

Run nohup python bgservice.py & to get the script to ignore the hangup signal and keep running. Output will be put in nohup. out . Ideally, you'd run your script with something like supervise so that it can be restarted if (when) it dies.

How do I run a Python file in Terminal background?

To run Python scripts as a background process on Linux or Mac, we use the & operator at the end of the command, which will make it run as a background process.

How do you fix matplotlib is currently using AGG which is a non GUI backend so Cannot show the figure?

To Solve UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure Error Here Error is mentioning that You must have installed GUI backend So that Just Install the GUI backend tk Using this command: sudo apt-get install python3-tk Second solution is You just need to install ...

How do I run a Python process in the background?

If you want to run any Python script in Background in Windows operating System then all you are required to do is to rename the extension of your existing Python script that you want to run in background to '. pyw'.


2 Answers

I believe your matplotlib backend requires X11. Look in your matplotlibrc file to determine what your default is (from the error, I'm betting TkAgg). To run without X11, use the Agg backend. Either set it globally in the matplotlibrc file or on a script by script by adding this to the python program:

import matplotlib matplotlib.use('Agg') 
like image 66
Mark Avatar answered Sep 23 '22 18:09

Mark


It looks like you're running in interactive mode by default, so matplotlib wants to plot everything to the screen first, which of course it can't do.

Try putting

ioff() 

at the top of your script, along with making the backend change.

reference: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.ioff

like image 38
Vicki Laidler Avatar answered Sep 22 '22 18:09

Vicki Laidler