通过SDK创建Azure Synapse工作区包如何将预配状态设为成功而非未完成
问题解决方法
你的代码缺少了上传完成后触发包正式发布的begin_flush步骤,这是预配状态始终无法变为Succeeded的核心原因。Synapse工作区自定义包上传完整流程分为三个强制步骤,你只执行了前两步,系统不会触发最终的校验和预配逻辑。
完整上传步骤
- 调用
begin_create创建包的占位资源,等待操作完成 - 调用
append上传包的二进制内容,大文件可分多次追加 - 调用
begin_flush提交所有已上传内容,触发系统校验和预配,等待该操作完成后包状态才会变为可用
修正后可运行代码
from time import sleep import os from azure.identity import DefaultAzureCredential from azure.synapse.artifacts import ArtifactsClient # 初始化客户端 client = ArtifactsClient( credential=DefaultAzureCredential(), endpoint="https://mysynapseworkspace.dev.azuresynapse.net" ) library_client = client.library # 注意:wheel_name必须和实际上传的whl文件名完全一致,否则校验会失败 wheel_file_path = 'C:\\path\\to\\wheelfile\\wheel_tester-0.0.1-py3-none-any.whl' wheel_name = os.path.basename(wheel_file_path) # 第一步:创建包占位 poller = library_client.begin_create(wheel_name) poller.result() print("包占位创建完成") # 第二步:上传包内容 file_size = os.path.getsize(wheel_file_path) with open(wheel_file_path, 'rb') as whl: library_client.append(library_name=wheel_name, content=whl) print("包内容上传完成") # 第三步:提交发布,必须传入已上传的总字节数 flush_poller = library_client.begin_flush(library_name=wheel_name, content_length=file_size) flush_poller.result() print("包发布完成,预配状态已变为Succeeded")
注意事项
- 包名
wheel_name必须和本地whl文件的全名完全匹配,不要随意修改名称,否则系统校验会直接失败 - 大于4MB的包建议拆分多个块,多次调用
append方法分段上传,避免单次请求超时 - 调用
begin_flush时传入的content_length必须和实际上传的文件字节数完全一致,否则会触发参数错误
内容的提问来源于stack exchange,提问作者Fjurg
相关产品推荐
相关产品推荐

