我正在尝试使用Python将文件复制到S3存储桶中,如下所示:
cmd = 'aws s3 %s %s' % (filename, bucketname)
os.system(cmd)
它给我一个sh: 1: aws: not found
错误。
然而,使用s3cmd
工作正常。
为什么s3cmd
有效,而aws
此外,我做了which aws
并返回:/home/username/anaconda/bin/aws
。
which s3cmd
返回:/home/username/anaconda/bin/s3cmd
。
为什么一个人工作,而不是另一个,尽管有相同的根?
答案 0 :(得分:2)
解决问题的一种快速方法是尝试OS调用的完整路径以查看它是否是PATH问题:
cmd = '/path/to/aws s3 %s %s' % (filename, bucketname)
os.system(cmd)
可能有一些原因导致这是一个问题,很可能与PATH变量有关(首先猜测)。但是,如文档(https://docs.python.org/2/library/os.html#os.system)中所述,最好避开os.system,并使用一些替代方法。
使用子流程:
cmd = ['/path/to/aws', 's3', filename, bucketname]
subprocess.Popen(cmd)
或者只使用python AWS客户端boto3包。有很多方法,但是这个SO问题(How to save S3 object to a file using boto3)中有一个简单的例子:
import boto3
s3_client = boto3.client('s3')
s3_client.upload_file(filename, bucketname, filename)
那个用moto无法测试,这可能很烦人。相反,如果你想测试,你可以这样做:
import boto3
s3_resource = boto3.resource('s3')
with open(filename, 'rb') as f:
binary = f.read()
s3_resource.Bucket(bucketname).put_object(
Key=filename,
Body=binary
)
答案 1 :(得分:2)
这是因为您的系统中未安装AWSCLI。我也遇到了同样的问题,我尝试使用(pip install --user awscli)与pip软件包管理器一起安装它,但是没有用。因此,我将其直接安装在系统中,如下所示:
curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
错误已解决。
答案 2 :(得分:0)
直接从zip安装:https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html#cliv2-linux-install
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install