使用crontab运行时,matplotlib savefig不起作用

时间:2013-05-18 07:44:27

标签: python matplotlib cron crontab

我正在尝试使用crontab运行python脚本,该脚本使用matplotlib来保存绘图png。正常运行时脚本运行正常/不是由cron运行。

我的crontab文件是:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * /home/matthew/Programs/random_walk/random_walk.py >/dev/null 2>&1

权限似乎设置正确,pythonpath似乎正确;我向random_walk.py添加了几行,用sys.path输出写了一个文件,并且在cron运行时有效。

一些博客文章和邮件列表表明,问题可以通过

来解决
import matplotlib
matplotlib.use('Agg')

在我的python文件的顶部(在shebang之后),但这没有帮助。

我的savefig代码是

if len(sys.argv) > 1:
    save_path = sys.argv[1].rstrip('/')+'/random_walk.png'
else:
    save_path = 'random_walk.png'
plt.savefig(save_path)

我怎样才能让cron和matplotlib一起玩得很好?

1 个答案:

答案 0 :(得分:2)

感谢@tcaswell,我发现问题是路径问题。

我的crontab文件未将图像文件位置传递给random_walk.py,因此图像保存在与我的crontab文件相同的目录中 - 与random_walk.py所在的目录不同。

解决方案1 ​​

将路径传递给crontab中的脚本,就像我想的那样。

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * /home/matthew/Programs/random_walk/random_walk.py /home/matthew/Programs/random_walk >/dev/null 2>&1

解决方案2

或者,我可以让python脚本始终将其输出文件写入我想要的位置。在这种情况下,我希望输出文件与random_walk.py位于同一目录中,因此我使用以下代码:

save_path = ''
if len(sys.argv) > 1:
    save_path = sys.argv[1].rstrip('/')+'/random_walk.png'
else:
    save_path = os.path.dirname(os.path.realpath(__file__))+'/random_walk.png'
plt.savefig(save_path)

注意

要明确,

import matplotlib
matplotlib.use('Agg')

也是使matplotlib与cron一起工作所必需的。