python - 使用 crontab 运行时 matplotlib savefig 不起作用

标签 python matplotlib cron

我正在尝试使用 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/

相关文章:

python - linspace 总是包含最后一点?

python - 如何编写 python 程序从磁盘镜像文件(.raw 文件)中读取数据?

python - 调用 plt.show() 后如何保持之前的图而不清除图形而不简单地重复调用?

ruby-on-rails - PG::UndefinedTable: 错误:关系 "services"不存在 LINE 1: SELECT "services".* FROM "services"

c# - Hangfire:设置重复作业的结束时间

Python 3 list(dictionary.keys()) 引发错误。我究竟做错了什么?

Python将每个字符串除以字符串的总长度

python - 使用 matplotlib 绘制具有可区分和不连续颜色的颜色条

python - python matplotlib 和子图大小的问题

javascript - 发送警报通知时播放声音