我第一次使用部署管道将Python函数应用程序部署到Azure:
https://docs.microsoft.com/bs-latn-ba/azure/azure-functions/functions-how-to-azure-devops
使用Kudu Zip部署将程序包部署到Azure。
我的http触发函数在本地(在Windows上)运行良好,但是在Azure上却出现500个内部错误,因为它找不到模块请求。
异常:ModuleNotFoundError:没有名为“ requests”的模块
__ init__.py的导入:
import logging, requests, os
import azure.functions as func
如果删除“请求”依赖项,则该功能将在Azure上运行(状态200)。
请求库由 requirement.txt 导入,并通过构建管道复制到.venv36 / lib / site-packages / requests。
所以我想知道包中内置的虚拟环境.venv36是否被Azure中部署的功能所使用。没有有关如何在Azure中激活虚拟环境的指示。
答案 0 :(得分:1)
如果您以链接的文档中的名称命名虚拟环境worker_venv
,则它应该可以工作(假设您在管道中使用Linux环境)。
但是,Python Azure Functions文档将很快更新,建议的方法是不从部署管道中部署整个虚拟环境。
相反,您想将软件包安装在.python_packages/lib/site-packages
中。
您可以做到-
pip3.6 install --target .python_packages/lib/site-packages -r requirements.txt
而不是-
python3.6 -m venv worker_venv
source worker_venv/bin/activate
pip3.6 install setuptools
pip3.6 install -r requirements.txt
它应该可以正常工作。
答案 1 :(得分:1)
使用最新版本的YAML管道模板,我们也遇到相同的问题:
- task: UsePythonVersion@0
displayName: 'Use Python 3.6'
inputs:
versionSpec: 3.6 # Functions V2 supports Python 3.6 as of today
- bash: |
python -m venv worker_venv
source worker_venv/bin/activate
pip install -r requirements.txt
workingDirectory: $(workingDirectory)
displayName: 'Install application dependencies'
删除虚拟环境步骤,功能应用程序已部署并运行,没有任何问题。这似乎不是Python的最佳做法。但是,这是我们唯一可以做的事情,以便在Azure DevOps Pipelines上正确部署它。
另外,在进行此更改之前,我们能够使用Visual Studio代码插件进行部署,这向我们表明这是环境问题。
- master
variables:
# Azure Resource Manager connection created during pipeline creation
azureSubscription: '<subscription-id>'
# Function app name
functionAppName: '<built-function-app-name>'
# Agent VM image name
vmImageName: 'ubuntu-latest'
# Working Directory
workingDirectory: '$(System.DefaultWorkingDirectory)/__app__'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: Build
displayName: Build
pool:
vmImage: $(vmImageName)
steps:
- bash: |
if [ -f extensions.csproj ]
then
dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin
fi
workingDirectory: $(workingDirectory)
displayName: 'Build extensions'
- task: UsePythonVersion@0
displayName: 'Use Python 3.7'
inputs:
versionSpec: 3.7 # Functions V2 supports Python 3.6 as of today
- bash: |
pip install --upgrade pip
pip install -r requirements.txt
workingDirectory: $(workingDirectory)
displayName: 'Install application dependencies'
- task: ArchiveFiles@2
displayName: 'Archive files'
inputs:
rootFolderOrFile: '$(workingDirectory)'
includeRootFolder: false
archiveType: zip
archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
replaceExistingArchive: true
- publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
artifact: drop
- stage: Deploy
displayName: Deploy stage
dependsOn: Build
condition: succeeded()
jobs:
- deployment: Deploy
displayName: Deploy
environment: 'production'
pool:
vmImage: $(vmImageName)
strategy:
runOnce:
deploy:
steps:
- task: AzureFunctionApp@1
displayName: 'Azure functions app deploy'
inputs:
azureSubscription: '$(azureSubscription)'
appType: functionAppLinux
appName: $(functionAppName)
package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
答案 2 :(得分:1)
肯定需要更明确地指出,部署 Azure Functions 时 Python 包的正确目录是 .python_packages/lib/site-packages
。我不得不深入挖掘 Azure Function Core Tools 源代码才能看到 where they put Python packages。
还必须在函数调试控制台中四处挖掘,以查看 Oryx 从何处获取包。
我猜 Version 3.7 YAML file here 中有一个指针,但没有标注目录的重要性,它是否适用于 Python 3.8 函数?
如果我没记错的话,这是使用 DevOps 部署 Python 函数的必要条件(除非您想安装 Function Core Tools 作为构建管道的一部分!)。
答案 3 :(得分:0)
您需要分别处理这两个进口,
import azure.functions as func
import requests
答案 4 :(得分:0)
希望我能正确理解您的问题。
在本地计算机上安装时,库会安装在python所在的位置(或至少在实际代码所在的位置之外)。这意味着,在打包代码时,实际上并没有将这些库放在一起。
要解决此问题,您可以使用虚拟环境。 Python提供了一个venv工具(还有一个标准的linux虚拟env工具),您可以通过以下方式运行它:
python -m venv /path/to/my/dir
source /path/to/my/dir/bin/activate
cd /path/to/my/dir/bin/activate
pip install -r requirements.txt
deactivate
我知道您提到了Windows,所以我建议您使用WSL和ubuntu映像(无论如何通常是一个不错的工具)。也许有一种方法可以使它在Windows中正常工作,尽管我不知道。
编辑:固定格式
答案 5 :(得分:0)
虽然很古老,但是:
* pip(python版本)install --target .python_packages/lib/site-packages -r requirements.txt
例如如果您使用的是3.7
,那么
pip3.7 install --target .python_packages/lib/site-packages -r requirements.txt
像魅力一样工作