[Matplotlib-users] Running matplotlib job with cron
I've written my first python script with matplotlib, which works fine at the command line but not with cron. It's quite puzzling to me, and probably involves some path declaration that I don't know about. #plot data from automate.csv import matplotlib import datetime import numpy from matplotlib import legend from matplotlib.pyplot import figure, show, plot_date, setp, ylabel, savefig, xlabel from matplotlib.dates import DayLocator, HourLocator, DateLocator, DateFormatter,drange, MinuteLocator, date2num, num2date from matplotlib.mlab import csv2rec from matplotlib.ticker import * newr = csv2rec('/home/paulsimon/Documents/automate.csv') x = date2num(newr.field(0)) fig = figure() ax1 = fig.add_subplot(111) line1, = ax1.plot_date(newr['dattim'], newr['bench_1'], '-r',label = 'bench 1') line2, = ax1.plot_date(newr['dattim'], newr['bench_2'], '-b', label = 'bench 2') line3, = ax1.plot_date(newr['dattim'], newr['eave'],'-k', label = 'eave') line4, = ax1.plot_date(newr['dattim'], newr['outside'], '-g', label = 'outside') ylabel('temperature') xlabel(r'time/date') hours = HourLocator(range(0,26,4)) dateformatter = DateFormatter('%I:%M %p\n%m/%d/%y') ax1.xaxis.set_major_formatter(dateformatter) ax1.xaxis.set_major_locator(hours) ax1.set_ylim(30,100) # Rotate x labels for label in ax1.xaxis.get_ticklabels(): label.set_fontsize(8) ax1.grid(True) ax1.xaxis.grid(False) yminorLocator = MultipleLocator(5) ax1.yaxis.set_minor_locator(yminorLocator) ax1.yaxis.grid(True,which='major', linestyle ='-') ax1.yaxis.grid(True,which='minor',linestyle = ':') leg = ax1.legend(('bench 1', 'bench 2', ' eave', 'outside'), 'lower right', shadow = True) for t in leg.get_texts(): t.set_fontsize('small') savefig('/home/paulsimon/python_scripts/image.png', format = 'png') Running with --debug option, here are the two different output files: $HOME=/home/paulsimon CONFIGDIR=/home/paulsimon/.matplotlib matplotlib data path /usr/lib/python2.5/site-packages/matplotlib/mpl-data loaded rc file /usr/lib/python2.5/site-packages/matplotlib/mpl-data/matplotlibrc matplotlib version 0.91.2 verbose.level debug interactive is False units is False platform is linux2 loaded modules: ['_bisect', 'xml.sax.urlparse', 'distutils', 'matplotlib.matplotlib', 'datetime', 'matplotlib.tempfile', 'distutils.sysconfig', 'encodings.encodings', 'pytz.cStringIO', 'xml', 'distutils.dep_util', 'struct', 'tempfile', 'xml.sax.urllib', 'imp', '_struct', 'pytz.os', 'zipimport', 'string', 'encodings.utf_8', 'matplotlib.__future__', 'pytz.tzinfo', 'pytz.datetime', 'distutils.re', 'bisect', 'signal', 'random', 'xml.sax.xmlreader', 'matplotlib.pytz', 'distutils.log', 'pytz.tzfile', 'cStringIO', 'pkgutil', 'locale', 'xml.sax.saxutils', 'encodings', 'dateutil', 'matplotlib.warnings', 'matplotlib.string', 'pytz.pytz', 'urllib', 'matplotlib.sys', 're', 'new', 'math', 'fcntl', 'UserDict', 'distutils.os', 'matplotlib', 'codecs', 'md5', '_locale', 'matplotlib.sre_constants', 'matplotlib.os', 'thread', 'pkg_resources', 'weakref', 'itertools', 'distutils.spawn', 'distutils.sys', 'os', 'sre_parse', '__future__', 'matplotlib.copy', 'xml.sax.types', '_sre', '__builtin__', 'matplotlib.re', 'operator', 'distutils.util', 'distutils.string', 'matplotlib.datetime', 'posixpath', 'errno', '_socket', 'binascii', 'sre_constants', 'matplotlib.md5', 'types', 'pytz.sys', 'xml.sax.handler', 'pytz.pkg_resources', 'xml.sax.os', 'matplotlib.xml', '_codecs', 'pytz', 'matplotlib.pyparsing', 'copy', 'socket', '_types', 'matplotlib.dateutil', 'hashlib', 'posix', 'encodings.aliases', 'matplotlib.fontconfig_pattern', 'exceptions', 'xml.sax._exceptions', 'pytz.bisect', 'distutils.distutils', 'copy_reg', 'sre_compile', 'xml.sax', '_hashlib', '_random', 'pytz.struct', 'site', '__main__', 'shutil', 'matplotlib.weakref', 'strop', 'encodings.codecs', 'gettext', 'matplotlib.rcsetup', 'pytz.sets', 'xml.sax.codecs', 'stat', '_ssl', 'warnings', 'encodings.types', 'sets', 'sys', 'xml.sax.sys', 'os.path', 'pytz.gettext', 'matplotlib.distutils', '_weakref', 'distutils.errors', 'urlparse', 'linecache', 'matplotlib.shutil', 'time'] Using fontManager instance from /home/paulsimon/.matplotlib/fontManager.cache numerix numpy 1.0.4 backend GTKAgg version 2.12.1 findfont found Bitstream Vera Sans, normal, normal 400, normal, 8.0 findfont returning /usr/lib/python2.5/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf findfont found Bitstream Vera Sans, normal, normal 400, normal, 8.0 findfont returning /usr/lib/python2.5/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf findfont found Bitstream Vera Sans, normal, normal 400, normal, 8.0 ... findfont returning /usr/lib/python2.5/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf findfont found Bitstream Vera Sans, normal, normal 400, normal, 9.996 findfont returning /usr/lib/python2.5/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf And this is the output file (complete) running under cron:
Re: [Matplotlib-users] Running matplotlib job with cron
Hello Paul, On Thu, Jun 25, 2009 at 19:13, Paul Simonpsi...@sonic.net wrote: I've written my first python script with matplotlib, which works fine at the command line but not with cron. It's quite puzzling to me, and probably involves some path declaration that I don't know about. I may have read the mail fast, but I can't see any notice about if the image outputs are different (other than the textual outputs). matplotlib version 0.91.2 You might also want to update: matplotlib latest release is 0.98.5.3 Regards, -- Sandro Tosi (aka morph, morpheus, matrixhasu) My website: http://matrixhasu.altervista.org/ Me at Debian: http://wiki.debian.org/SandroTosi -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] Running matplotlib job with cron
Hi Sandro, There is no image output when the script is run from cron. I think that is what you are asking. I thought about updating matplotlib but at this point don't want to change versions unless all else fails. Im running Mandriva 2008.1 and it's a lot of work. Is there a more detailed way I can debug to find out where the failure is? Paul - Original Message - From: Sandro Tosi matrixh...@gmail.com To: Paul Simon psi...@sonic.net Cc: matplotlib-users@lists.sourceforge.net Sent: Thursday, June 25, 2009 12:00 PM Subject: Re: [Matplotlib-users] Running matplotlib job with cron Hello Paul, On Thu, Jun 25, 2009 at 19:13, Paul Simonpsi...@sonic.net wrote: I've written my first python script with matplotlib, which works fine at the command line but not with cron. It's quite puzzling to me, and probably involves some path declaration that I don't know about. I may have read the mail fast, but I can't see any notice about if the image outputs are different (other than the textual outputs). matplotlib version 0.91.2 You might also want to update: matplotlib latest release is 0.98.5.3 Regards, -- Sandro Tosi (aka morph, morpheus, matrixhasu) My website: http://matrixhasu.altervista.org/ Me at Debian: http://wiki.debian.org/SandroTosi -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] Running matplotlib job with cron
Paul Simon wrote: I've written my first python script with matplotlib, which works fine at the command line but not with cron. It's quite puzzling to me, and probably involves some path declaration that I don't know about. #plot data from automate.csv import matplotlib Right here you should include: matplotlib.use('Agg') Without this, you are loading the interactive graphical backend, gtkagg. I don't know whether this is causing the problem with running under cron, but it is worth changing anyway. I don't know why your debug output file is stopping after the first fontManager line. What does your crontab file look like? I think this is more a cron problem than an mpl problem. Cron tends to run things in a very different environment than one has when running from the command line, and it is common--at least in my own experience--to have this sort of problem with things that work on the command line and not from cron. Attached is a crontab file that we use in this manner. Note that we set the shell to /bin/bash; otherwise cron will use the most minimal shell version. Second, note that before executing the script, we execute a file that sets up the environment to be similar to what we have when logged in normally. Third, the redirection of stdout and stderr to a log file facilitates debugging, allowing you to see the result of debugging print statements as well as any exceptions or other error messages. Eric import datetime import numpy from matplotlib import legend from matplotlib.pyplot import figure, show, plot_date, setp, ylabel, savefig, xlabel from matplotlib.dates import DayLocator, HourLocator, DateLocator, DateFormatter,drange, MinuteLocator, date2num, num2date from matplotlib.mlab import csv2rec from matplotlib.ticker import * newr = csv2rec('/home/paulsimon/Documents/automate.csv') x = date2num(newr.field(0)) fig = figure() ax1 = fig.add_subplot(111) line1, = ax1.plot_date(newr['dattim'], newr['bench_1'], '-r',label = 'bench 1') line2, = ax1.plot_date(newr['dattim'], newr['bench_2'], '-b', label = 'bench 2') line3, = ax1.plot_date(newr['dattim'], newr['eave'],'-k', label = 'eave') line4, = ax1.plot_date(newr['dattim'], newr['outside'], '-g', label = 'outside') ylabel('temperature') xlabel(r'time/date') hours = HourLocator(range(0,26,4)) dateformatter = DateFormatter('%I:%M %p\n%m/%d/%y') ax1.xaxis.set_major_formatter(dateformatter) ax1.xaxis.set_major_locator(hours) ax1.set_ylim(30,100) # Rotate x labels for label in ax1.xaxis.get_ticklabels(): label.set_fontsize(8) ax1.grid(True) ax1.xaxis.grid(False) yminorLocator = MultipleLocator(5) ax1.yaxis.set_minor_locator(yminorLocator) ax1.yaxis.grid(True,which='major', linestyle ='-') ax1.yaxis.grid(True,which='minor',linestyle = ':') leg = ax1.legend(('bench 1', 'bench 2', ' eave', 'outside'), 'lower right', shadow = True) for t in leg.get_texts(): t.set_fontsize('small') savefig('/home/paulsimon/python_scripts/image.png', format = 'png') Running with --debug option, here are the two different output files: $HOME=/home/paulsimon CONFIGDIR=/home/paulsimon/.matplotlib matplotlib data path /usr/lib/python2.5/site-packages/matplotlib/mpl-data loaded rc file /usr/lib/python2.5/site-packages/matplotlib/mpl-data/matplotlibrc matplotlib version 0.91.2 verbose.level debug interactive is False units is False platform is linux2 loaded modules: ['_bisect', 'xml.sax.urlparse', 'distutils', 'matplotlib.matplotlib', 'datetime', 'matplotlib.tempfile', 'distutils.sysconfig', 'encodings.encodings', 'pytz.cStringIO', 'xml', 'distutils.dep_util', 'struct', 'tempfile', 'xml.sax.urllib', 'imp', '_struct', 'pytz.os', 'zipimport', 'string', 'encodings.utf_8', 'matplotlib.__future__', 'pytz.tzinfo', 'pytz.datetime', 'distutils.re', 'bisect', 'signal', 'random', 'xml.sax.xmlreader', 'matplotlib.pytz', 'distutils.log', 'pytz.tzfile', 'cStringIO', 'pkgutil', 'locale', 'xml.sax.saxutils', 'encodings', 'dateutil', 'matplotlib.warnings', 'matplotlib.string', 'pytz.pytz', 'urllib', 'matplotlib.sys', 're', 'new', 'math', 'fcntl', 'UserDict', 'distutils.os', 'matplotlib', 'codecs', 'md5', '_locale', 'matplotlib.sre_constants', 'matplotlib.os', 'thread', 'pkg_resources', 'weakref', 'itertools', 'distutils.spawn', 'distutils.sys', 'os', 'sre_parse', '__future__', 'matplotlib.copy', 'xml.sax.types', '_sre', '__builtin__', 'matplotlib.re', 'operator', 'distutils.util', 'distutils.string', 'matplotlib.datetime', 'posixpath', 'errno', '_socket', 'binascii', 'sre_constants', 'matplotlib.md5', 'types', 'pytz.sys', 'xml.sax.handler', 'pytz.pkg_resources', 'xml.sax.os', 'matplotlib.xml', '_codecs', 'pytz', 'matplotlib.pyparsing', 'copy', 'socket', '_types', 'matplotlib.dateutil', 'hashlib', 'posix', 'encodings.aliases', 'matplotlib.fontconfig_pattern', 'exceptions', 'xml.sax._exceptions', 'pytz.bisect', 'distutils.distutils', 'copy_reg', 'sre_compile', 'xml.sax', '_hashlib', '_random',
Re: [Matplotlib-users] Running matplotlib job with cron
Paul Eric's attachment was missing. This is the crontab we use, which he described: - we use bash - the file config/bash_env has most of what is usually in .bashrc; for cron we source it, for shell we source it in .bashrc - daily.py --use_defaults is the command that we want to run - don't forget that early inclusion of matplotlib.use('Agg') ## here is the relevant part of crontab # m h dom mon dow command 40 20 * * * (cd $HOME; . config/bash_env; daily.py --use_defaults) $HOME/tmp/cron.log 2 1 Reference for matplotlib.use('Agg'): http://matplotlib.sourceforge.net/faq/howto_faq.html?highlight=agg#generate-images-without-having-a-window-popup Jules -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users