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