You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2.7环境下Boto2 S3上传脚本迁移到Boto3的问题咨询

Boto2 迁移 Boto3(Python 2.7 环境)改动指南

首先提前确认依赖:Boto3 最后支持 Python 2.7 的版本为 1.17.112,配套 botocore 版本为 1.20.112,安装时指定版本即可避免兼容问题:pip install boto3==1.17.112 botocore==1.20.112


1. 认证与S3连接、桶遍历逻辑改动

原 Boto2 全局配置凭证、连接S3、遍历桶对象的逻辑可以直接替换为以下代码:

import boto3

# 直接在初始化S3资源时传入凭证,无需修改全局配置,更适配多实例场景
self.s3 = boto3.resource(
    's3',
    aws_access_key_id='%aws_access_key_id%',
    aws_secret_access_key='%aws_secret_access_key%'
)
# 等价原Boto2的get_bucket方法
self.bucket = self.s3.Bucket('%aws_bucket%')
self.prefix = "%aws_prefix%"
self.manifest_prefix = "%aws_manifest%"
self.domain = "%aws_domain%"

self.s3_keys = []
self.uploadTrack = {"i": 0, "total": 0}
self.myprint("Generating list of files in bucket")
timer = datetime.now()
# 等价原Boto2的bucket.list方法,返回的对象key属性对应原Key对象的name属性
for obj in self.bucket.objects.filter(Prefix=self.prefix + remoteStorePath + "/"):
    self.s3_keys.append(obj.key.rstrip().split('/')[-2] + obj.key.rstrip().split('/')[-1])

self.myprint(str(len(self.s3_keys)) + " files in s3 bucket took " + str(datetime.now() - timer))

对应差异点:

  • 废弃 Boto2 全局修改 config 的凭证配置方式,初始化资源时直接传入凭证即可,也兼容原有 ~/.aws/credentials 配置文件逻辑
  • 桶对象遍历方法从 list() 改为 objects.filter(Prefix=xxx)
  • 原 Key 对象的 name 属性统一改为 key 属性

2. 文件上传逻辑改动(Key对象等价实现)

你询问的 k = boto.s3.key.Key(self.bucket) 在 Boto3 中的等价实现为 self.bucket.Object(完整key路径),改造后的上传代码如下:

def upload_file(self, details, ttl='259200'):
    startTime = datetime.now()
    initialHash = details[:2]
    if initialHash == "zz":
        initialHash = "ad"
    local_file = os.path.join(overrideStorePath, "files", initialHash, details[2:])

    # 等价原Boto2的创建Key对象+赋值key路径的逻辑
    k = self.bucket.Object(
        self.prefix + remoteStorePath + '/' + details[:2] + '/' + details[2:]
    )

    # 等价原set_metadata+set_contents_from_filename,元数据统一放在ExtraArgs参数中
    k.upload_file(
        local_file,
        ExtraArgs={
            'CacheControl': 'max-age=' + ttl
        }
    )
    i = self.uploadTrack["i"] + 1
    self.uploadTrack["i"] += 1
    total = self.uploadTrack["total"]
    p = int(100 * i / total)
    self.myprint("Uploaded '{}' : {} of {} :  {}% in {} : {} kb".format(k.key, str(i), str(total), str(p), str(datetime.now() - startTime), str(os.path.getsize(local_file) / 1024)))
    return True

对应差异点:

  • 无需单独创建空Key对象再赋值路径,直接调用桶的Object方法传入完整路径即可得到对应的对象实例
  • 原分开调用的set_metadata和set_contents_from_filename合并为upload_file方法的ExtraArgs参数,所有缓存控制、ACL、自定义元数据都放在该参数中配置
  • 原有其他上传逻辑(分片上传、下载、删除对象)都可以通过S3 Resource接口直接对应,核心业务逻辑无需修改

3. Python2.7 环境额外注意事项

  • 所有路径、文件名如果包含非ASCII字符,统一转成UTF-8编码再传入接口,编码逻辑和Boto2完全一致
  • 不要安装高于指定版本的boto3、botocore,否则会直接出现Python版本不兼容报错

内容的提问来源于stack exchange,提问作者Dan_96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 12:48:04