首页 > 解决方案 > crontab 即使在添加路径后也无法使用 anaconda python(cron 调用 .sh 文件,而后者又调用 .py 文件)

问题描述

我有一个 cronjob:

1 11 * * * /home/ubuntu/anaconda3/bin/python /home/ubuntu/ga_data/gaV4/tva_gaApiUpdate.sh > /dev/null 2 >> tvaUpdater.log

这是 .sh 文件:

#!/bin/bash
cd /home/ubuntu/ga_data/gaV4
python gaAPIWorkingVersion.py
echo "ran cron at" | tee -a  "$tvaUpdater.log"
echo $(date) | tee -a  "$tvaUpdater.log"

日志文件的输出是:

Traceback (most recent call last):
  File "gaAPIWorkingVersion.py", line 13, in <module>
    from apiclient.discovery import build
ImportError: No module named apiclient.discovery

我用 cron 调用一个 .sh 文件,而该 cron 又调用一个 .py 文件。我这样做是因为在 .sh 文件中我使用 cd 更改目录,因此我不必将 .py 脚本中的路径更改为绝对路径。这是因为我较大的 .py 脚本从它的目录中打开了几个文件。因此,我不是直接在 cron 中调用 python,而是通过首先调用 .sh 文件来间接调用。

当我自己直接运行 .sh 或 .py 脚本时,一切正常。只有当 cron 尝试这样做时,我才会收到上述错误。

如果我进入which python终端,我会得到/home/ubuntu/anaconda3/bin/python.

我尝试将该行添加到我的 .sh 文件中,如下所示:

#!/bin/bash
cd /home/ubuntu/ga_data/gaV4
python /home/ubuntu/anaconda3/bin/python gaAPIWorkingVersion.py

但这也引发了错误。

如何让 cron 使用正确版本的 python(在这种情况下为 anaconda)?

标签: pythonshellcronanaconda

解决方案


尝试将您的 cron 更改为:

1 11 * * * /home/ubuntu/ga_data/gaV4/tva_gaApiUpdate.sh > /dev/null 2 >> tvaUpdater.log

和脚本

#!/bin/bash
cd /home/ubuntu/ga_data/gaV4
/home/ubuntu/anaconda3/bin/python gaAPIWorkingVersion.py
echo "ran cron at" | tee -a  "$tvaUpdater.log"
echo $(date) | tee -a  "$tvaUpdater.log"

确保直接运行 scipt 的用户与 cronjob 的用户相同。如果仍有问题,请检查使用 crontab 运行脚本时无法导入 Python MySQL 模块


推荐阅读