我正在尝试使用 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 很好地协同工作?
最佳答案
感谢@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 一起工作。
关于python - 使用 crontab 运行时 matplotlib savefig 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16621926/