当前位置: 首页 > 知识库问答 >
问题:

通过Python运行AWS CLI将返回“sh:1:AWS:notfound”错误

韦德厚
2023-03-14

我正在尝试使用Python将文件复制到S3存储桶中,如下所示:

cmd = 'aws s3 %s %s' % (filename, bucketname)
os.system(cmd)

它给我一个sh:1:aws:notfound错误。

但是,使用s3cmd效果很好。

为什么s3cmd能工作,而aws不能工作?

另外,我做了哪个aws,它返回:/home/username/anaconda/bin/aws

s3cmd返回:/home/username/anaconda/bin/s3cmd

为什么一个根相同,但另一个却不起作用?

共有3个答案

祖麻雀
2023-03-14

直接从zip安装:https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html#cliv2-linux安装

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
常源
2023-03-14

解决此问题的一种快速方法是尝试操作系统调用的完整路径,以查看是否存在路径问题:

cmd = '/path/to/aws s3 %s %s' % (filename, bucketname)
os.system(cmd)

这是一个问题,可能有几个原因,很可能与PATH变量有关(乍一看)。然而,正如文档中提到的,最好不要使用os.system(https://docs.python.org/2/library/os.html#os.system)并使用一些替代方法。

使用子过程

cmd = ['/path/to/aws', 's3', filename, bucketname]
subprocess.Popen(cmd)

或者只是使用python AWS客户端boto3包。有很多方法,但是这个SO问题中的一个快速例子(如何使用boto3将S3对象保存到文件中):

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
)
薛淮晨
2023-03-14

这是因为您的系统中未安装AWSCLI。我也有同样的问题,我试着用pip软件包管理器安装它,使用pip install--user awscli,但它不起作用。因此,我将其直接安装在系统中,如下所示:

curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

解决了这个错误。

 类似资料:
  • 当“事件ID”与“用户ID”匹配时,im会尝试从我的“事件”表中选择所有数据。然而,我得到一个错误1242,子查询返回超过1行。 我理解我的子查询将返回多行,因为一个用户可以参加多个事件。那么我如何使我的查询接受多行呢?

  • 我已将作业安排在每天12:30运行,并使用以下命令: 现在我不明白了。我会说发生这种情况是因为没有设置环境变量,那么为什么它可以从Shell中工作呢?

  • 我不知道当我在Mysql中运行查询时,会出现此错误。 #1242-子查询返回超过1行 谁能帮我解决这个问题?

  • 问题内容: 如果PHP脚本在某处失败,是否有办法使PHP返回AJAX错误代码?我正在关注一个教程,并将其输入到我的PHP中: 一切都很好,直到我意识到这是JSON数据。有没有一种方法可以使用标准的$ _POST和返回的HTML数据返回错误(例如,触发jQuery的AJAX 事件? 问题答案: 我不了解jQuery,但是如果它区分成功和失败(HTTP 200 OK vs. HTTP!= 200)Aj

  • 问题内容: 我目前在一个项目中同时使用C 和Java,并且希望能够将包含在C 中的对象发送到我的Java接口,以便通过GUI对其进行修改,然后将所做的修改发送回C ++中。 到目前为止,我一直没有通过JNI接口向Java返回int或boolean值。这次我必须通过接口发送对象。我已经在C ++和Java中提供了类似的类定义。 我想知道如何创建对象,以便可以在Java中使用它。 在C ++中,我有:

  • 我通过这个简单的演示来再现这个问题: -o0编译并运行: