【问题标题】:s3.Object() throws TypeError: sequence item 0: expected str instance, tuple founds3.Object() 抛出 TypeError: sequence item 0: expected str instance, tuple found
【发布时间】:2019-07-18 05:22:31
【问题描述】:

按照 boto3 文档,我尝试这样做:

session = boto3.Session(
aws_access_key_id=KEY,
aws_secret_access_key=SECRET_KEY
)
s3 = session.resource('s3')

obj = s3.Object('test', 'test/myfile.csv')

当我运行 obj.get() 时,我收到:

TypeError:序列项 0:预期的 str 实例,找到元组

我需要获取这个 csv 文件的内容。

当我尝试使用客户端而不是会话时,它会起作用:

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='test', Key='test/myfile.csv')

【问题讨论】:

  • 我以前见过类似的东西,它实际上是从错误参数到boto3.Session(...) 的延迟错误——这些参数没有按照你期望的方式进行验证,如果任何一个的值KEYSECRET_KEY(或另一个未显示的参数)实际上不是字符串,会话第一次尝试签署请求时会弹出此错误。如果您查看完整的堆栈跟踪,则会更加明显。记录这些值,以检查这一点。

标签: python amazon-s3 boto3 digital-ocean


【解决方案1】:

此问题适用于 AWS S3 存储桶和 DigitalOcean Spaces 存储桶。

复制错误:

import boto3

KEY = '********************',
SECRET_KEY = '*******************************************'

# Initialize a session using DigitalOcean Spaces.
session = boto3.session.Session()

client = session.client('s3', region_name='sgp1',
                        endpoint_url='https://sgp1.digitaloceanspaces.com',
                        aws_access_key_id=KEY,
                        aws_secret_access_key=SECRET_KEY)

抛出错误:

~/.pyenv/versions/3.8.0/lib/python3.8/site-packages/botocore/auth.py in scope(self, request)
    322         scope.append(self._service_name)
    323         scope.append('aws4_request')
--> 324         return '/'.join(scope)
    325 
    326     def credential_scope(self, request):

TypeError: sequence item 0: expected str instance, tuple found

看起来 API 有问题,但如果我们仔细观察,

>>>print(type(SECRET_KEY))
str

>>> print(type(KEY))
tuple

正如michael-sqlbot 所评论的,在其中一个身份验证键中有一个tuple 类型。

请注意上面代码中的逗号:

import boto3

KEY = '********************',

只需去掉逗号即可将其更改为字符串类型:

import boto3

KEY = '********************',
SECRET_KEY = '*******************************************'

# Initialize a session using DigitalOcean Spaces.
session = boto3.session.Session()

client = session.client('s3', region_name='sgp1',
                        endpoint_url='https://sgp1.digitaloceanspaces.com',
                        aws_access_key_id=KEY,
                        aws_secret_access_key=SECRET_KEY)

[出]:

{'ResponseMetadata': {'RequestId': '*************',
  'HostId': '',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'transfer-encoding': 'chunked',
   'x-amz-request-id': '*************',
   'content-type': 'application/xml',
   'date': 'Mon, 15 Jun 2020 01:14:42 GMT',
   'strict-transport-security': 'max-age=15552000; includeSubDomains; preload'},
  'RetryAttempts': 0},
 'Buckets': [{'Name': '*****',
   'CreationDate': datetime.datetime(2019, 11, 20, 8, 28, 36, 548000, tzinfo=tzutc())}],
 'Owner': {'DisplayName': '*******', 'ID': '********'}}

【讨论】:

  • 您的回答为我节省了数小时的故障排除时间。非常感谢。不知道为什么@Desiigner 不接受这个作为答案,但它解决了我的问题。
猜你喜欢
  • 2021-01-22
  • 2022-12-28
  • 1970-01-01
  • 2018-12-25
  • 2011-11-06
  • 2019-04-08
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多