Python 获取botocore.exceptions.NoCredentialsError:无法定位凭据,尤其是在使用CronTab时

Python 获取botocore.exceptions.NoCredentialsError:无法定位凭据,尤其是在使用CronTab时,python,amazon-s3,cron,raspbian,boto3,Python,Amazon S3,Cron,Raspbian,Boto3,我知道我们对这个错误有两个答案。不过,我的问题与此不同,因此我提出这个问题 我正在将音频文件从raspberry pi推送到AWS-S3实例。当我手动运行脚本时,上传工作没有任何问题。但是,当通过crontab实例运行相同的脚本时,它会抛出上述错误 我的python代码如下所示: import boto3 import argparse import os ap=argparse.ArgumentParser() ap.add_argument("-f","--filetoupload", re

我知道我们对这个错误有两个答案。不过,我的问题与此不同,因此我提出这个问题

我正在将音频文件从raspberry pi推送到AWS-S3实例。当我手动运行脚本时,上传工作没有任何问题。但是,当通过crontab实例运行相同的脚本时,它会抛出上述错误

我的python代码如下所示:

import boto3
import argparse
import os
ap=argparse.ArgumentParser()
ap.add_argument("-f","--filetoupload", required=True, help="file to upload")
args=vars(ap.parse_args())
file = os.path.basename(args['filetoupload'])
client=boto3.client('s3', region_name='ap-south-1')
print("[INFO:] Uploading file to cloud")
client.upload_file(args['filetoupload'],'MyS3Bucket',file)
print("[INFO:] File upload completed successfully")
[INFO:] Uploading file to cloud
Traceback (most recent call last):
  File "/home/pi/s3upload.py", line 10, in <module>
    client.upload_file(args['filetoupload'],'MyS3Bucket',file)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 110, in upload_file
    extra_args=ExtraArgs, callback=Callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 279, in upload_file
    future.result()
  File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 73, in result
    return self._coordinator.result()
  File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 233, in result
    raise self._exception
botocore.exceptions.NoCredentialsError: Unable to locate credentials
script finished
我在bash脚本中调用这个python脚本

python /home/pi/s3upload.py --filetoupload /home/pi/upload/${FILENAME}.mp3
mp3文件被创建,如上所述,当我手动运行它时,它运行起来没有任何问题

我检查了
.aws
文件夹中的
config
credentials
文件。如SO中的其他响应所示,它们以默认值开始,并设置了正确的凭据

完整的错误消息如下所示:

import boto3
import argparse
import os
ap=argparse.ArgumentParser()
ap.add_argument("-f","--filetoupload", required=True, help="file to upload")
args=vars(ap.parse_args())
file = os.path.basename(args['filetoupload'])
client=boto3.client('s3', region_name='ap-south-1')
print("[INFO:] Uploading file to cloud")
client.upload_file(args['filetoupload'],'MyS3Bucket',file)
print("[INFO:] File upload completed successfully")
[INFO:] Uploading file to cloud
Traceback (most recent call last):
  File "/home/pi/s3upload.py", line 10, in <module>
    client.upload_file(args['filetoupload'],'MyS3Bucket',file)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 110, in upload_file
    extra_args=ExtraArgs, callback=Callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 279, in upload_file
    future.result()
  File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 73, in result
    return self._coordinator.result()
  File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 233, in result
    raise self._exception
botocore.exceptions.NoCredentialsError: Unable to locate credentials
script finished
[INFO:]将文件上载到云
回溯(最近一次呼叫最后一次):
文件“/home/pi/s3upload.py”,第10行,在
client.upload_文件(args['filetoupload'],'MyS3Bucket',文件)
文件“/usr/local/lib/python2.7/dist packages/boto3/s3/inject.py”,第110行,在upload_文件中
额外参数=额外参数,回调=回调)
文件“/usr/local/lib/python2.7/dist packages/boto3/s3/transfer.py”,上传文件第279行
future.result()
文件“/usr/local/lib/python2.7/dist packages/s3transfer/futures.py”,结果中的第73行
返回self.\u coordinator.result()
文件“/usr/local/lib/python2.7/dist packages/s3transfer/futures.py”,第233行,在结果中
提出自己的意见
botocore.exceptions.NoCredentialsError:找不到凭据
脚本完成

默认情况下,当crontab运行脚本时,它将
$HOME
变量设置为
/

AWS在解析为
$HOME/.AWS
的位置查找其凭据

因此,您需要将.aws目录移动到根目录中(这可能不是一个好主意),或者重新定义
$HOME
以指向包含
.aws
目录的文件夹

如果要从shell脚本运行python脚本,最简单的方法是添加:

export /HOME=/home/pi/

当您从crontab运行时,
$HOME
默认为
/
。查找AWS凭据时,默认位置为
$HOME/.AWS
,因此可能找不到它们。您可以尝试在crontab调用中更改$HOME,或者将文件重新定位到/.aws(不推荐)。@jeremycg谢谢。1) 我尝试将python文件移动到.aws文件夹中,并对sh文件中的路径进行了更改..不起作用..2)我已更新了bashrc和profile中的导出路径=$path:/home/pi/.aws/。3)在我的crontab中添加了cd/home/pi/.aws,并以*****作为时间轴…它们都不起作用…我确信在设置$HOME…你能举个例子吗pls@jeremycg谢谢…我尝试了这个,但仍然得到相同的错误。请尝试将
export HOME=/HOME/pi/
导出到您的.sh脚本。您还可以尝试从脚本中将路径和主变量打印到文件中,以确保它们设置为您所期望的。@jeremycg再次感谢您……我刚刚在sh脚本中添加了echo$home作为脚本的第二行,它开始上传文件,没有出现任何问题。我相信一定有一个原因,我还没有弄明白。