Azure Web App配置Python3.8后部署仍调用Python3.5如何解决
问题属性判定
该问题是Azure Linux App Service平台的已知设计逻辑差异,不属于配置错误:
- 你在门户、管道任务中配置的
PYTHON|3.8运行时栈,仅作用于Web应用的业务进程(即承载Django服务的gunicorn进程),与Kudu(SCM管理组件)的运行环境完全隔离。 - Kudu作为平台预装的管理服务,自身固定使用系统镜像自带的Python 2.7、Python 3.5作为内置运行时,不会自动继承你为业务应用配置的Python版本。
- 你通过SSH登录时能正常使用Python3.8,是因为SSH会话会自动加载Web应用的业务环境变量,将配置的Python路径注入PATH优先级最前端;但管道中嵌入的Inline Script是直接交由Kudu执行的,不会加载这套业务环境变量,因此脚本里调用的
python3自然会命中Kudu自带的Python3.5。 - 日志中找不到
django==3.1.4的报错属于必然结果:Django 3.1版本最低要求Python 3.7环境,Python 3.5的pip索引中不存在对应版本的安装包。
落地方案
按照优先级从高到低排列:
方案一(推荐,稳定性最高)
将依赖安装逻辑从部署后脚本挪到CI构建阶段完成,从根源绕开Kudu的环境问题:
- 在构建流水线中,启用和线上一致的Python 3.8任务,在应用代码目录下创建名为
antenv的虚拟环境。 - 用该虚拟环境的pip安装
requirements.txt中的所有依赖,再将整个应用目录(包含antenv虚拟环境)一起打包为部署制品。 - 部署时直接上传制品即可,不需要再在部署任务中配置任何依赖安装脚本,平台启动时会自动识别
antenv虚拟环境并启动服务。
方案二(需保留部署后装依赖场景的适配)
调整Inline Script内容,显式指定Python 3.8的绝对路径,绕过PATH默认匹配到的老版本Python:
Azure Linux App Service上预装的Python 3.8固定存放在/opt/python/目录下,无需依赖系统PATH查找,调整后的脚本参考如下:
echo "自动匹配Python 3.8路径" PYTHON38=$(ls /opt/python/3.8*/bin/python3 | tail -n 1) echo "当前使用的Python版本:" $PYTHON38 --version echo "升级pip" $PYTHON38 -m pip install --upgrade pip echo "安装项目依赖" $PYTHON38 -m pip install -r xxx/requirements.txt
关键注意事项
- 禁止在脚本中直接调用
/usr/bin/python3,该路径永远指向系统镜像内置的Python3.5,和你配置的业务运行时完全无关。 - 日志中出现的
Defaulting to user installation because normal site-packages is not writeable提示,是错用系统Python路径导致的权限异常,换用正确的Python3.8路径后会自动消失。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

