我有一个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
答案 0 :(得分:0)
crontab可能使用的Python版本与手动运行时使用的Python版本不同。每次安装Python都会加载其各自的sys路径,并且它们可能会有所不同。我遇到了同样的错误,并通过使用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的标准位置)。因此,从
更改了我的crontab0 1 * * * python file_that_imports_boto3.py
到
0 1 * * * ~/miniconda3/bin/python file_that_imports_boto3.py
为我解决了这个问题。希望这会有所帮助!
答案 1 :(得分:-1)
很显然,从命令提示符运行脚本和从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