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
相关产品推荐
相关产品推荐

