【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

相关文章
|
2天前
|
前端开发 API C++
【Azure APIM】通过 API Management 公开API为 MCP Server 的试验 (二)
本文详解如何将 Azure API 管理(APIM)中已有的 REST API(如 Echo API)快速配置为 MCP 服务器,涵盖创建步骤、VS Code 配置、常见连接错误(如 SSE 流终止)及关键规避方案——禁用全局响应日志有效负载记录,并建议仅暴露单个 GET 操作以确保稳定。
|
3天前
|
人工智能 监控 API
【Azure APIM】通过 API Management 公开现有 MCP Server 的试验 (一)
本文介绍如何利用Azure API Management(APIM)代理公开现有MCP Server,实现统一鉴权、限流、审计与网络管控。通过APIM暴露Microsoft Learn MCP服务,并在VS Code中配置GitHub Copilot调用,验证AI工具集成方案。
|
1月前
|
运维 前端开发 安全
【Azure App Service】解析 Azure App Service 中的 X-Ms-Forbidden-Ip 响应头
Azure App Service 的 `X-Ms-Forbidden-Ip` 响应头可辅助判断 403 是否由平台访问限制触发,标识被拒客户端IP。虽未正式文档化,但在受控链路中是实用排障线索,建议结合诊断日志综合验证。
312 3
【Azure App Service】解析 Azure App Service 中的 X-Ms-Forbidden-Ip 响应头
|
22天前
|
JSON 人工智能 网络协议
【Azure Application Insights】公网白名单应用如何使用 Application Insights 可用性测试?
Azure VM应用启用AI可用性测试后探测失败,因探测源自微软托管节点IP,未在公网白名单中。解决方案:下载中国云IP范围JSON,提取ApplicationInsightsAvailability和ActionGroup的addressPrefixes,手动添加对应CIDR至NSG/防火墙白名单,并定期同步更新。
|
23天前
|
人工智能 Go
【Azure AI】Work smarter in 90 days: A real-world guide to using AI / 90 天内更⾼效地⼯作:⼀本关于使⽤ AI 的实⽤指南 [逐句翻译版] 【转】
《开放工作:如何在人工智能时代取得进步》提供90天AI赋能职业发展蓝图:第1-30天夯实基础,用AI提效;31-60天强化好奇心、创造力等五大人类核心能力;61-90天规划进阶路径。附实用Copilot提示与分步实践指南。
122 3
|
29天前
|
容器
【Azure Container App】Key Vault的Secret修改导致Container App重启,是否有办法规避呢?
本文解析Container App因Key Vault密钥更新自动重启的原因:当环境变量引用的密钥(未指定版本)更新时,系统会触发RevisionRestartWithNewSecrets事件,在30分钟内自动重启以获取最新值。建议指定密钥版本以手动控制更新时机,避免非预期滚动重启。
|
30天前
|
数据安全/隐私保护
【Azure Key Vault】在 Logic App 中调用 Key Vault 的 Key 进行加密/解密操作时权限报错问题
Logic App调用Key Vault密钥加解密时403报错,常因密钥级权限未开启:即使访问策略已授权,仍需单独为该密钥勾选“Encrypt/Decrypt”等Permitted operations,否则操作被拒。
|
1月前
|
存储 网络协议 API
【Azure Storage Account】跨存储账号复制 Blob 会产生大量网络流量费用吗?
本文详解Azure跨账号复制Blob的流量与费用问题:采用服务器端复制(如`StartCopyFromUriAsync`)时,数据不经过应用网络,避免高额出站流量费;而“下载再上传”则会产生显著带宽和NAT等成本。关键看复制方式,非账号是否相同。
|
15天前
|
存储 网络安全
【Azure Policy】Policy修正任务为Azure资源添加诊断日志报错问题的调查
本文详解Azure Policy修正任务部署失败原因:诊断日志(Microsoft.Insights/diagnosticSettings)作为扩展资源,必须通过`scope`属性指定父资源,而非将路径拼入`name`。提供正确ARM模板写法及两点解决要点,助您快速修复合规配置问题。
|
17天前
|
人工智能 数据挖掘 API
【Azure APIM】APIM的诊断日志与Application Insights的日志是否可以串联为一个端到端的日志链路呢?
可通过 AzureDiagnostics 的 CorrelationId 关联 Application Insights 的 operation_Id,实现 APIM 与后端服务的端到端调用链追踪。需注意跨 AI 实例时须显式 union 多个 app() 数据源