【Azure Function App】升级 Python 运行时 3.9 到3.10 后遇见的问题

简介: Azure Functions 升级 Python 3.9→3.10 时,仅改 Portal 配置易致故障:一是复用旧版依赖引发加载超时(Exit 137);二是 typing_extensions 与实际运行时(如 3.13)不兼容,抛 AttributeError。须重装依赖、锁定 typing_extensions≥4.12,并验证真实 Python 版本。

问题描述

Azure Function 原来运行在 Python 3.9。由于 Python 3.9 即将停止维护,需要升级到 Python 3.10。

第一次升级时,只是在 Function App 页面中进入Settings → Configuration → General settings,将 Python 版本从 3.9 修改为 3.10。

Function App 表面上可以正常启动,但绑定的 Service Bus topic-subscription 消息不再被正常消费。

观察到的主要错误如下:

Loading function failed. ExceptionType: System.TimeoutException
Timeout value of 00:30:00 exceeded by function 'Functions.func1'
Executed 'Functions.func1' (Failed, Duration=1800022ms)
Message processing error (Action=ProcessMessageCallback, EntityPath=<topic-name>/Subscriptions/<subscription-name>)

后台日志中还可以看到 Python Worker 被强制终止:

The process with PID XXXX (language worker) was forcefully terminated.
Exit code: 137 (SIGKILL)

之后重新部署了新的 package,但消息仍然无法消费。这次错误变成了函数加载阶段立即失败:

[Error] Executed 'Functions.func1' (Failed, Duration=1ms)
Exception: AttributeError: attribute '__default__' of 'typing.ParamSpec' objects is not writable

堆栈中可以看到错误发生在导入azure.storage.blob的过程中,最终落到typing_extensions.py

File ".../azure/storage/blob/_blob_client.py", line 22, in <module>
    from azure.core.tracing.decorator import distributed_trace
File ".../azure/core/tracing/decorator.py", line 37, in <module>
    P = ParamSpec("P")
File ".../typing_extensions.py", line 1474, in _set_default
    type_param.__default__ = None
AttributeError: attribute '__default__' of 'typing.ParamSpec' objects is not writable

问题解答

这次问题主要分成两个阶段。

1. 只修改 Function App 运行时版本,依赖包没有重新构建

第一个错误的重点是:

System.TimeoutException
Duration=1800022ms
exit code 137 / SIGKILL

这说明函数并不是业务代码执行慢,而是在 Worker 加载函数时卡住,最终被 Host 强制终止。

常见原因是应用使用WEBSITE_RUN_FROM_PACKAGE方式部署,zip 包中的 Python 依赖是在旧的 Python 3.9 环境下安装或编译的。

只在 Portal 中把运行时改成 Python 3.10 后,云端解释器变成了 3.10,但包里的原生依赖仍可能是 3.9 的构建产物,例如grpcioprotobufcryptography等,从而导致函数加载异常或超时。

建议处理方式:

  • 在本地准备目标 Python 版本环境,例如 Python 3.10。
  • 删除旧依赖包,不复用 Python 3.9 环境下生成的 package。
  • 在 Python 3.10 环境下重新安装依赖:
pip install --upgrade pip
pip install -r requirements.txt
  • 重新打包并部署。

2.typing_extensions与实际 Python 运行时不兼容

第二个错误的重点是:

AttributeError: attribute '__default__' of 'typing.ParamSpec' objects is not writable

如果堆栈中出现类似下面的路径:

/azure-functions-host/workers/python/3.13/...

说明当前实际运行环境可能涉及 Python 3.13。旧版typing_extensions与 Python 3.13 中typing.ParamSpec.__default__的行为不兼容,可能在导入azure.storage.blobazure.core.tracing.decorator等依赖时直接失败。

建议处理方式:

  • requirements.txt中显式指定较新的typing_extensions版本:
typing_extensions>=4.12.0
  • 重新安装依赖并重新打包:
pip install --upgrade pip
pip install -r requirements.txt
  • 部署后检查 Function App 实际 Python 运行时版本,确认它和预期一致。
  • 如果目标是 Python 3.10,需要确认配置没有实际运行到 Python 3.13。
  • 再次验证函数是否可以正常加载,以及 Service Bus topic-subscription 中的消息是否可以正常消费

总结

Azure Functions 升级 Python 运行时时,不建议只在 Portal 中修改 Python 版本。

更稳妥的顺序是:

准备目标 Python 版本环境
→ 重新安装依赖
→ 重新打包
→ 部署到 Staging Slot 验证
→ 确认实际运行时版本
→ Swap 到生产环境

这次排查中,两个关键点分别是:

  • System.TimeoutExceptionDuration=1800022msexit code 137:优先检查是否复用了旧 Python 版本构建出来的依赖包。
  • AttributeError: attribute '__default__' of 'typing.ParamSpec' objects is not writable:优先检查typing_extensions版本,以及实际运行的 Python 版本是否符合预期。

参考资料

更新 Azure Functions 中的语言堆叠版本 :https://docs.azure.cn/zh-cn/azure-functions/update-language-versions?tabs=azure-portal%2Clinux&pivots=programming-language-python

attribute '__default__' of 'typing.ParamSpec' objects is not writableon Python 3.13 :https://github.com/python/typing_extensions/issues/404

相关文章
|
22天前
|
人工智能 自然语言处理 API
【Azure AI Search】Index的字段使用默认Analyzer(standard.lucene) 和 en.microsoft 有什么不同?
Azure AI Search英文检索因词形差异(如brief/briefs)无法匹配,根源在于analyzer选择:默认standard.lucene不处理词形还原,而en.microsoft支持lemmatization,可将变体还原为基本形式。需通过新增字段并配置en.microsoft analyzer解决,兼顾检索质量与业务需求。
237 124
|
21天前
|
人工智能 自然语言处理 API
【Azure AI Search】 stopword 是什么,为什么它会影响搜索结果?
本文解析 Azure AI Search 中搜索 &quot;in brief&quot; 返回结果过多的问题,指出根源在于 analyzer 对停用词(如 &quot;in&quot;)的处理差异:默认 `standard.lucene` 保留停用词导致泛匹配,而 `en.microsoft` 会过滤停用词,使结果更精准。关键在于根据业务语义选择合适 analyzer。
219 121
|
18天前
|
人工智能 数据可视化 开发工具
Codex 新增/usage 系列命令:自适应主题查看token消耗
OpenAI Codex 新增 `/usage` 系列命令,支持在终端实时查看 Token 消耗(总体/日/周/累计),采用异步加载、主题自适应渲染与瞬态卡片设计,将成本管理无缝融入开发工作流,标志着其从代码助手向“AI 开发操作系统”演进的关键一步。(239字)
311 1
|
5天前
|
运维 前端开发 安全
【Azure App Service】解析 Azure App Service 中的 X-Ms-Forbidden-Ip 响应头
Azure App Service 的 `X-Ms-Forbidden-Ip` 响应头可辅助判断 403 是否由平台访问限制触发,标识被拒客户端IP。虽未正式文档化,但在受控链路中是实用排障线索,建议结合诊断日志综合验证。
115 3
【Azure App Service】解析 Azure App Service 中的 X-Ms-Forbidden-Ip 响应头
|
18天前
|
人工智能 开发工具 git
Zed Git 终于支持直接与任意分支对比了
Zed 编辑器新增「git: compare with branch」功能,支持在命令面板中直接选择任意分支进行对比,一步到位,无需中转默认上游分支。减少认知负担,提升多分支并行对比效率,细节优化彰显对开发者真实工作流的深刻理解。(239字)
164 2
|
5天前
|
存储 网络协议 API
【Azure Storage Account】跨存储账号复制 Blob 会产生大量网络流量费用吗?
本文详解Azure跨账号复制Blob的流量与费用问题:采用服务器端复制(如`StartCopyFromUriAsync`)时,数据不经过应用网络,避免高额出站流量费;而“下载再上传”则会产生显著带宽和NAT等成本。关键看复制方式,非账号是否相同。
|
11天前
|
存储 人工智能 缓存
多 Provider AI 调用的三笔暗账:切换成本、账单碎片与审计盲区
SaaS团队多模型混用(Claude/DeepSeek/豆包/Kimi)暴露三大隐性成本:Prompt切换导致性能漂移、四平台账单碎片化致对账困难、审计无溯源链路。40天异常支出难发现,Uber已设单工具月限1500美元。解法:统一API网关+调用归因+资产沉淀。
130 1
|
11天前
|
弹性计算 安全 Linux
2026年阿里云服务器选型与网站部署全攻略:从服务器选型、配置到上线一站式指南
2026年阿里云服务器生态已形成轻量应用服务器与ECS云服务器两大核心体系,适配个人博客、企业官网、电商平台、应用开发等全场景建站需求。本文从服务器选型、配置选择、网站部署全流程、安全与运维优化四大维度,提供2026年最新实操指南,帮助用户精准选型、高效建站、稳定上线。
207 3
|
11天前
|
JavaScript API Go
Online CAD实现命令行驱动与参数化绘图的方法(web dwg edit)
本文详解MxCAD Web端命令行系统与参数化绘图的实现:从UI搭建、事件监听、命令注册到动态执行;涵盖静态写死与动态交互(含`setUserDraw`实时预览)两种绘图模式,助你构建专业级Web CAD交互能力。(239字)
|
11天前
|
Cloud Native 关系型数据库 调度
SaaS 架构演进:基于云原生的混合多租户数据隔离与即时配送调度实践
本文介绍青海青帝科技“物理与逻辑混合隔离”云原生SaaS架构:通过动态数据源路由,兼顾小微商户共享数据库的低成本接入与连锁企业专属RDS的物理隔离需求;融合自送与第三方运力的智能配送调度,支撑高并发即时零售场景。(239字)
95 1