我正在尝试使用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一起玩得很好?
答案 0 :(得分:2)
感谢@tcaswell,我发现问题是路径问题。
我的crontab文件未将图像文件位置传递给random_walk.py,因此图像保存在与我的crontab文件相同的目录中 - 与random_walk.py所在的目录不同。
将路径传递给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
或者,我可以让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一起工作所必需的。