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:

$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’, ‘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’, ‘encodings.ascii’, ‘sets’, ‘sys’, ‘xml.sax.sys’, ‘os.path’, ‘pytz.gettext’, ‘matplotlib.distutils’, ‘_weakref’, ‘distutils.errors’, ‘urlparse’, ‘linecache’, ‘matplotlib.shutil’, ‘time’]
numerix numpy 1.0.4
Using fontManager instance from /home/paulsimon/.matplotlib/fontManager.cache

The plot output took me a lot of time to work out, which I enjoyed, and the output is dazzling!

Paul Simon

Hello Paul,

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,

···

On Thu, Jun 25, 2009 at 19:13, Paul Simon<psimon@...436...> wrote:
--
Sandro Tosi (aka morph, morpheus, matrixhasu)
My website: http://matrixhasu.altervista.org/
Me at Debian: http://wiki.debian.org/SandroTosi

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

crontab.uhdas (140 Bytes)

···

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:
$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', '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', 'encodings.ascii', 'sets', 'sys', 'xml.sax.sys', 'os.path', 'pytz.gettext', 'matplotlib.distutils', '_weakref', 'distutils.errors', 'urlparse', 'linecache', 'matplotlib.shutil', 'time']
numerix numpy 1.0.4
Using fontManager instance from /home/paulsimon/.matplotlib/fontManager.cache
The plot output took me a lot of time to work out, which I enjoyed, and the output is dazzling!
Paul Simon

------------------------------------------------------------------------

------------------------------------------------------------------------------

------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users