运行 AWS CLI 通过 Python returns 一个 "sh: 1: aws: not found" 错误

Running AWS CLI through Python returns a "sh: 1: aws: not found" error

我正在尝试使用 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 returns: /home/username/anaconda/bin/s3cmd.

为什么一个有效,而另一个无效,尽管具有相同的根?

解决此问题的一种快速方法是尝试 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 问题 () 中的一个简单示例:

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
)

这是因为您的系统中没有安装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

错误已解决。

直接从 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