通过Azure DevOps部署Azure Python Function App时无法导入包
问题:Python函数应用部署到生产环境后函数不显示,依赖模块无法导入
问题背景
本地及VS Code部署的Python Function App运行正常,但部署到高级计划+集成虚拟网络的生产环境Function App时出现异常:部署成功但函数列表不显示,日志提示“Http触发器同步失败”,所有依赖模块无法导入。
部署环境差异
- 开发环境:无服务器架构,未集成VNet,通过VS Code右键菜单>部署到Function App完成部署
- 生产环境:高级计划(Premium Plan),已集成虚拟网络,通过Azure DevOps流水线部署
流水线配置(Build+Deploy阶段)
trigger: - none variables: # Azure Resource Manager connection created during pipeline creation azureServiceConnectionId: '******' # Web app name webAppName: '*******' # Agent VM image name vmImageName: 'ubuntu-latest' # Environment name environmentName: 'PROD' # Project root folder. Point to the folder containing manage.py file. projectRoot: $(System.DefaultWorkingDirectory) # Resource group resourceGroupName : '********' # Python version: 3.11 pythonVersion: '3.11' stages: - stage: Build displayName: Build stage jobs: - job: BuildJob pool: Default steps: - script: | pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt workingDirectory: $(projectRoot) displayName: "Install requirements" - task: ArchiveFiles@2 displayName: 'Archive files' inputs: rootFolderOrFile: '$(projectRoot)' includeRootFolder: false archiveType: zip archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip replaceExistingArchive: true - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip displayName: 'Upload package' artifact: drop - stage: Deploy displayName: 'Deploy Web App' dependsOn: Build condition: succeeded() jobs: - deployment: DeploymentJob pool: Default environment: $(environmentName) strategy: runOnce: deploy: steps: - task: AzureFunctionApp@2 displayName: 'Deploy Azure Web App' inputs: connectedServiceNameARM: '$(azureServiceConnectionId)' appType: 'functionAppLinux' appName: '$(webAppName)' package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip' runtimeStack: 'PYTHON|3.11' appSettings: '-KeyvaultURL ***** -StorageaccountURL *****' deploymentMethod: 'auto'
额外尝试的部署方式(Azure CLI)
- task: AzureCLI@2 displayName: 'Deploy with Azure CLI' inputs: azureSubscription: '$(azureServiceConnectionId)' scriptType: 'pscore' scriptLocation: 'inlineScript' inlineScript: | $artifactPath = "$(Pipeline.Workspace)/drop/$(Build.BuildId).zip" az functionapp deployment source config-zip -g $(resourceGroupName) -n $(webAppName) --src $artifactPath --verbose
问题现象
两种部署方式均显示部署成功,但函数不显示;日志显示:
- Http触发器同步失败
- 依赖模块无法导入(尽管日志确认包存在于路径
/home/site/wwwroot/.python_packages/lib/site-packages/pandas/)
已尝试的解决方法
- 调整流水线中
ENABLE_ORYX_BUILD和SCM_DO_BUILD_DURING_DEPLOYMENT的组合配置 - 切换使用zipDeploy和package部署类型
解决方案建议
1. 确保依赖包的跨平台兼容性
在Build阶段安装依赖时,指定Linux平台的二进制包,避免本地(Windows/macOS)安装的包无法在Linux环境运行:
pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt --platform manylinux2014_x86_64 --only-binary=:all:
2. 配置Python路径应用设置
在生产环境Function App的应用设置中添加:
PYTHONPATH:/home/site/wwwroot:/home/site/wwwroot/.python_packages/lib/site-packages
确保Python解释器能识别依赖模块的存放路径。
3. 禁用自动构建流程
在流水线的AzureFunctionApp@2任务中添加应用设置,跳过Oryx自动构建:
appSettings: '-KeyvaultURL ***** -StorageaccountURL ***** -ENABLE_ORYX_BUILD false -SCM_DO_BUILD_DURING_DEPLOYMENT false'
预构建已在Build阶段完成,避免Oryx覆盖或修改已安装的依赖。
4. 检查虚拟网络出站规则
确认生产环境Function App所在子网允许以下出站访问:
- Azure存储账户(函数需访问存储同步触发器)
- 必要的Azure内部服务端点
5. 验证文件权限
登录Kudu控制台,检查依赖目录权限,确保Python进程可读取:
ls -la /home/site/wwwroot/.python_packages/lib/site-packages/
若权限不足,执行:
chmod -R 755 /home/site/wwwroot/.python_packages/
6. 核对运行时版本
确认生产环境Function App的Python运行时版本为3.11,与流水线指定的runtimeStack: 'PYTHON|3.11'完全一致。
内容的提问来源于stack exchange,提问作者Boris Jovanovic
相关产品推荐
相关产品推荐

