我有一个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