我知道我们对此错误有几个答案。但是,我的问题因此而有所不同。
我正在将覆盆子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")
我在bash脚本中调用这个python脚本。
python /home/pi/s3upload.py --filetoupload /home/pi/upload/${FILENAME}.mp3
创建了mp3文件,如上所述,当我手动运行时,它运行没有任何问题。
我检查了config
文件夹中的credentials
和.aws
个文件。如SO中的其他响应所示,它们以默认开头并设置了正确的凭据。
完整的错误消息如下:
[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
答案 0 :(得分:2)
默认情况下,当crontab运行脚本时,它会将$HOME
变量设置为/
。
AWS在解析为$HOME/.aws
的位置查找其凭据。
因此,您需要将.aws目录移动到根目录,这可能不是一个好主意,或者重新定义$HOME
以指向包含您的.aws
目录的文件夹。< / p>
如果从shell脚本运行python脚本,最简单的方法是添加:
export /HOME=/home/pi/
到shell脚本的开头。