调用Azure Blob Python SDK generate_blob_sas报TypeError求助
问题根因
这个报错触发的核心原因是generate_blob_sas内部做参数序列化时,拿到了set集合类型的参数值,和你提到的「其他模块参数能正常用」不冲突,这个问题90%以上集中在SDK版本兼容、权限类导入错误、参数尾逗号导致的类型异常三个场景。
排查修复步骤
- 先升级SDK到稳定版
旧版azure-storage-blob(12.10.0以前版本)存在BlobSasPermissions类内部解析的已知bug,执行以下命令升级即可修复:pip install --upgrade azure-storage-blob - 核对权限类导入路径
必须从blob专属模块导入BlobSasPermissions,错误导入其他存储服务(文件、队列、表存储)的SasPermissions类,会导致内部权限值解析成集合类型触发报错,正确导入写法:from azure.storage.blob import BlobSasPermissions, generate_blob_sas - 检查所有入参的隐式类型问题
逐个核对传入的参数:- 不要在参数赋值末尾加多余的逗号,Python中字符串后加尾逗号会自动转为单元素元组,比如
account_name="xxx",实际传入的是元组而非字符串,会触发序列化错误 expiry参数必须传入datetime类型实例,不要传日期对象、时间戳整数- 不要给
permission参数直接传集合、列表、字典类型值
- 不要在参数赋值末尾加多余的逗号,Python中字符串后加尾逗号会自动转为单元素元组,比如
- 临时兼容写法
如果暂时不能升级SDK,可以直接跳过BlobSasPermissions类,传入对应权限的缩写字符串即可,对应你需要的只读场景,修正后的可运行代码如下:from datetime import datetime, timedelta from azure.storage.blob import generate_blob_sas sas_blob = generate_blob_sas( account_name=account_name, container_name=container_name, blob_name=blob, account_key=account_key, permission="r", # 只读传"r",需要写就拼"w",需要创建拼"c",多权限直接拼接字符串即可 expiry=datetime.utcnow() + timedelta(hours=2) )
权限字符串对应规则:读=r、写=w、删除=d、添加=a、创建=c,多权限直接按顺序拼接即可,不需要依赖权限类。
内容的提问来源于stack exchange,提问作者Robert Salca
相关产品推荐
相关产品推荐

