我正在尝试编写"好"的python并捕获S3没有这样的关键错误:
session = botocore.session.get_session()
client = session.create_client('s3')
try:
client.get_object(Bucket=BUCKET, Key=FILE)
except NoSuchKey as e:
print >> sys.stderr, "no such key in bucket"
Run Code Online (Sandbox Code Playgroud)
但NoSuchKey没有定义,我无法将其跟踪到我需要定义的导入.
e.__class__是botocore.errorfactory.NoSuchKey,但from botocore.errorfactory import NoSuchKey给出了一个错误,from botocore.errorfactory import *也不管用,我不希望捕捉一般错误.
我正在尝试从boto3 s3客户端对象模拟一个单一方法来抛出异常.但我需要这个类的所有其他方法正常工作.
这样我可以在执行upload_part_copy时测试单个异常测试并发生错误
第一次尝试
import boto3
from mock import patch
with patch('botocore.client.S3.upload_part_copy', side_effect=Exception('Error Uploading')) as mock:
client = boto3.client('s3')
# Should return actual result
o = client.get_object(Bucket='my-bucket', Key='my-key')
# Should return mocked exception
e = client.upload_part_copy()
Run Code Online (Sandbox Code Playgroud)
但是,这会产生以下错误:
ImportError: No module named S3
Run Code Online (Sandbox Code Playgroud)
第二次尝试
在查看了botocore.client.py源代码后,我发现它正在做一些聪明的事情并且该方法upload_part_copy不存在.我发现它似乎在调用,BaseClient._make_api_call所以我试图嘲笑它
import boto3
from mock import patch
with patch('botocore.client.BaseClient._make_api_call', side_effect=Exception('Error Uploading')) as mock:
client = boto3.client('s3')
# Should return actual result
o = client.get_object(Bucket='my-bucket', Key='my-key')
# Should return mocked exception
e …Run Code Online (Sandbox Code Playgroud) 我需要在脚本中获取"当前用户" 的帐户IDboto3.到目前为止,我最好的解决方案是解析当前用户arn:
>>> import boto3
>>> account_id = boto3.resource('iam').CurrentUser().arn.split(':')[4]
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更"轻量级"的方法.事实上
>>> timeit.timeit("boto3.resource('iam').CurrentUser().arn",
... 'import boto3', number=10)
4.8895583080002325
Run Code Online (Sandbox Code Playgroud)
我实际上不需要CurrentUser脚本中的资源.
我正在尝试boto3使用配置文件(~/aws/confg)覆盖某些变量.在我的用例中,我想使用fakes3服务并将S3请求发送到localhost.
在boto(不boto3)中,我可以创建一个~/.boto与此类似的配置:
[s3]
host = localhost
calling_format = boto.s3.connection.OrdinaryCallingFormat
[Boto]
is_secure = False
Run Code Online (Sandbox Code Playgroud)
客户端可以成功获取所需的更改,而不是将流量发送到真正的S3服务,它会将其发送到localhost.
>>> import boto
>>> boto.connect_s3()
S3Connection:localhost
>>>
Run Code Online (Sandbox Code Playgroud)
我试图用boto3库来实现类似的结果.通过查看源代码,我发现我可以使用~/aws/config位置.我还在unittests文件夹中找到了一个示例配置botocore.
我试图修改配置以实现所需的行为.但不幸的是它不起作用.
这是配置:
[default]
aws_access_key_id = XXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYY
region = us-east-1
is_secure = False
s3 =
host = localhost
Run Code Online (Sandbox Code Playgroud)
clients使用配置文件变量?在文档之后,我正在尝试创建一个更新或添加的更新语句,如果在dynamodb表中只存在一个属性.
我正在尝试这个
response = table.update_item(
Key={'ReleaseNumber': '1.0.179'},
UpdateExpression='SET',
ConditionExpression='Attr(\'ReleaseNumber\').eq(\'1.0.179\')',
ExpressionAttributeNames={'attr1': 'val1'},
ExpressionAttributeValues={'val1': 'false'}
)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the UpdateItem operation: ExpressionAttributeNames contains invalid key: Syntax error; key: "attr1"
如果有人做了类似于我想要实现的任何事情,请分享示例.
我已经能够查看botocore发送的PreparedRequest的属性,但我想知道如何查看发送给AWS的确切请求字符串.我需要确切的请求字符串才能将它与我正在测试AWS调用的另一个应用程序进行比较.
我想import的exception是,当发生boto3 ssm不与发现的参数get_parameter.我正在尝试为库添加一些额外的ssm功能moto,但我在这一点上很难过.
>>> import boto3
>>> ssm = boto3.client('ssm')
>>> try:
ssm.get_parameter(Name='not_found')
except Exception as e:
print(type(e))
<class 'botocore.errorfactory.ParameterNotFound'>
>>> from botocore.errorfactory import ParameterNotFound
ImportError: cannot import name 'ParameterNotFound'
>>> import botocore.errorfactory.ParameterNotFound
ModuleNotFoundError: No module named 'botocore.errorfactory.ParameterNotFound'; 'botocore.errorfactory' is not a package
Run Code Online (Sandbox Code Playgroud)
但是,Exception无法导入,并且似乎不存在于botocore代码中.如何导入此例外?
有没有办法在 Python3 中使用 boto3 同时下载 S3 文件?我知道aiobotocore库,但我想知道是否有办法使用标准boto3库来做到这一点。
在一个空间有限的小型嵌入式Linux设备上,我试图将大型[10 Mb]亚马逊(AWS)BotoCore库(https://github.com/boto/botocore)放在一个zip文件中进行压缩,然后导入它在我的Python脚本中使用zipimport,如PEP273(https://www.python.org/dev/peps/pep-0273/)中所述.
我修改了我的脚本,在开头有以下几行:
## Use zip imports
import sys
sys.path.insert(0, '/usr/lib/python2.7/site-packages/site-packages.zip')
Run Code Online (Sandbox Code Playgroud)
site-packages zip文件中只包含botocore,而site-packages目录本身也有我使用的其他模块,但不包括botocore.
这是该目录的列表:
/usr/lib/python2.7/site-packages >> ls -rlt
total 1940
-rw-rw-r-- 1 root root 32984 Jun 8 12:22 six.pyc
-rw-r--r-- 1 root root 119 Jun 11 07:43 README
drwxrwxr-x 2 root root 4096 Jun 11 07:43 requests-2.4.3-py2.7.egg-info
drwxrwxr-x 2 root root 4096 Jun 11 07:43 six-1.9.0-py2.7.egg-info
drwxrwxr-x 2 root root 4096 Jun 11 07:43 python_dateutil-2.4.2-py2.7.egg-info
drwxrwxr-x 2 root root 4096 Jun 11 07:43 jmespath-0.7.0-py2.7.egg-info
-rw-rw-r-- 1 …Run Code Online (Sandbox Code Playgroud) 我打算使用 Python 对存储在 S3 中的非常大的 csv 文件执行一些内存密集型操作,目的是将脚本移动到 AWS Lambda。我知道我可以读入整个 csv nto 内存,但我肯定会遇到 Lambda 的内存和存储限制,有这么大的文件,有什么方法可以使用 boto3 将 csv 的块流式传输或一次读取到 Python 中/ botocore,理想情况下通过指定要读入的行号?
以下是我已经尝试过的一些事情:
1) 使用range参数 inS3.get_object指定要读入的字节范围。不幸的是,这意味着最后几行在中间被截断,因为无法指定要读入的行数。有一些混乱的解决方法,例如扫描最后一个换行符,记录索引,然后将其用作下一个字节范围的起点,但如果可能的话,我想避免这种笨拙的解决方案。
2) 使用 S3 select 编写 sql 查询以有选择地从 S3 存储桶中检索数据。不幸的row_numbers是,不支持 SQL 函数,而且看起来没有办法读取行的子集。
botocore ×10
python ×9
boto3 ×8
amazon-s3 ×2
boto ×2
mocking ×1
moto ×1
pep ×1
python-2.7 ×1
python-3.x ×1