1

我正在尝试使用 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 一起玩得很好?

4

1 回答 1

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 一起工作也是必要的。

于 2013-05-18T20:05:26.300 回答