Python脚本在crontab中不起作用,但在其他情况下则起作用

时间:2018-07-07 10:08:47

标签: python amazon-web-services ubuntu-16.04

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

2 个答案:

答案 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的标准位置)。因此,从

更改了我的crontab
0 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