Python 脚本在 crontab 中不起作用,但在以其他方式调用时工作



我有一个python脚本来拍摄AWS中所有正在运行的实例的卷的快照。该脚本在 crontab 中不起作用,但在否则调用时它将工作。

我已经将 cronjob 的输出写入了一个文件,这是输出:

Traceback (most recent call last):
File "completeBackUp2.py", line 2, in <module>
import boto3
ImportError: No module named boto3

已安装 BOTO3,如前所述,否则调用脚本时可以正常工作。

这是我的 crontab 的样子:

0 1 * * * /usr/bin/python  /opt/scripts/backup/completeBackUp2.py > /opt/scripts/backup/output 2>&1

crontab 使用的 Python 版本可能与您手动运行时使用的版本不同。每个 Python 安装都会加载其各自的系统路径,它们可能会有所不同。我遇到了同样的错误,并通过使用我手动运行脚本的which python输出作为 crontab 中的命令来解决问题。更多信息如下。

当您通过命令行手动运行脚本时(例如,python file_that_imports_boto3.py(,您将使用为该位置配置的任何版本的 Python(假设您的计算机上有多个 Python 安装(。如果您在手动运行 Python 文件的位置运行which python,则可以看到正在使用哪个 Python 安装。就我而言,which python的输出是

~/miniconda3/bin/python

然而,我的 crontab 正在使用

/usr/lib64/python2.7

(这是 Amazon EC2 上 Python 2.7 的标准位置(。所以改变我的 crontab 从

0 1 * * * python file_that_imports_boto3.py

0 1 * * * ~/miniconda3/bin/python file_that_imports_boto3.py

为我解决了这个问题。希望这有帮助!

显然,当您从命令提示符运行脚本和从cron运行脚本时,导入 PATH 是不同的。

了解什么是导入路径:

$ python
>>> import sys
>>> sys.path

然后将目录列表复制粘贴到脚本的开头,例如:

import sys
sys.path = [ ... what you found in the previous step ... ]
import boto3    # this should be AFTER you've made changes to sys.path

相关内容

最新更新