通过Python运行AWS CLI会返回“sh:1:aws:not found”错误

时间:2015-07-18 01:17:17

标签: python amazon-web-services amazon-s3 aws-cli s3cmd

我正在尝试使用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

为什么一个人工作,而不是另一个,尽管有相同的根?

3 个答案:

答案 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