通过Python运行awscli返回“sh:1:AWS:not found”

2024-05-15 21:42:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

它给我一个sh: 1: aws: not found错误。在

但是,使用s3cmd就可以了。在

为什么s3cmd有效,而{}不起作用?在

另外,我做了which aws,它返回:/home/username/anaconda/bin/aws。在

which s3cmd返回:/home/username/anaconda/bin/s3cmd。在

为什么一个有效,另一个却不能,尽管有相同的根?在


Tags: 文件cmdawswhichhomebins3os
1条回答
网友
1楼 · 发布于 2024-05-15 21:42:20

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

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

这是一个问题,可能有几个原因,很可能与路径变量有关(一开始猜测)。不过,最好还是避开操作系统如文档(https://docs.python.org/2/library/os.html#os.system)中所述,并使用一些替代方法。在

使用子流程:

^{pr2}$

或者只使用pythonaws客户机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
)

相关问题 更多 >