Problemen met Python-fouten oplossen in Azure Functions
Dit artikel bevat informatie over het oplossen van fouten met uw Python-functies in Azure Functions. Dit artikel ondersteunt zowel de v1- als v2-programmeermodellen. Kies het model dat u wilt gebruiken in de selector boven aan het artikel.
Notitie
Het Python v2-programmeermodel wordt alleen ondersteund in de runtime van 4.x-functies. Raadpleeg Overzicht van Azure Functions-runtime voor meer informatie.
Dit zijn de secties voor probleemoplossing voor veelvoorkomende problemen in Python-functies:
In het bijzonder met het v2-model zijn hier enkele bekende problemen en hun tijdelijke oplossingen:
- Kan bestand of assembly niet laden
- Kan de Azure Storage-verbinding met de naam Storage niet oplossen
Algemene handleidingen voor probleemoplossing voor Python Functions zijn:
Problemen oplossen: ModuleNotFoundError
Deze sectie helpt u bij het oplossen van modulefouten in uw Python-functie-app. Deze fouten resulteren doorgaans in het volgende Azure Functions-foutbericht:
Uitzondering: ModuleNotFoundError: Geen module met de naam 'module_name'.
Deze fout treedt op wanneer een Python-functie-app een Python-module niet kan laden. De hoofdoorzaak voor deze fout is een van de volgende problemen:
- Kan het pakket niet vinden
- Het pakket is niet opgelost met het juiste Linux-wiel
- Het pakket is niet compatibel met de Python-interpreterversie
- Het pakket conflicteert met andere pakketten
- Het pakket ondersteunt alleen Windows- en macOS-platforms
Projectbestanden weergeven
Als u de werkelijke oorzaak van uw probleem wilt identificeren, moet u de Python-projectbestanden ophalen die worden uitgevoerd in uw functie-app. Als u de projectbestanden niet op uw lokale computer hebt, kunt u ze op een van de volgende manieren ophalen:
- Als de functie-app een
WEBSITE_RUN_FROM_PACKAGE
app-instelling heeft en de waarde ervan een URL is, downloadt u het bestand door de URL naar uw browser te kopiëren en te plakken. - Als de functie-app is
WEBSITE_RUN_FROM_PACKAGE
ingesteld op1
, gaat u naarhttps://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages
het bestand en downloadt u het vanaf de meest recentehref
URL. - Als de functie-app geen van de voorgaande app-instellingen heeft, gaat u naar
https://<app-name>.scm.azurewebsites.net/api/settings
de URL onderSCM_RUN_FROM_PACKAGE
. Download het bestand door de URL naar uw browser te kopiëren en te plakken. - Als suggesties het probleem oplossen, gaat u naar
https://<app-name>.scm.azurewebsites.net/DebugConsole
en bekijkt u de inhoud onder/home/site/wwwroot
.
De rest van dit artikel helpt u bij het oplossen van mogelijke oorzaken van deze fout door de inhoud van uw functie-app te inspecteren, de hoofdoorzaak te identificeren en het specifieke probleem op te lossen.
Diagnose ModuleNotFoundError
In deze sectie worden mogelijke hoofdoorzaken van modulegerelateerde fouten beschreven. Nadat u hebt opgegeven wat de waarschijnlijke hoofdoorzaak is, kunt u naar de gerelateerde beperking gaan.
Kan het pakket niet vinden
Ga naar .python_packages/lib/python3.6/site-packages/<package-name>
of .python_packages/lib/site-packages/<package-name>
. Als het bestandspad niet bestaat, is dit ontbrekende pad waarschijnlijk de hoofdoorzaak.
Het gebruik van hulpprogramma's van derden of verouderde hulpprogramma's tijdens de implementatie kan dit probleem veroorzaken.
Zie Externe build - of buildeigen afhankelijkheden inschakelen om dit probleem te verhelpen.
Het pakket is niet opgelost met het juiste Linux-wiel
Ga naar .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info
of .python_packages/lib/site-packages/<package-name>-<version>-dist-info
. Gebruik uw favoriete teksteditor om het wielbestand te openen en de sectie Tag: te controleren. Het probleem kan zijn dat de tagwaarde geen Linux bevat.
Python-functies worden alleen uitgevoerd in Linux in Azure. De Functions Runtime v2.x wordt uitgevoerd op Debian Stretch en de v3.x-runtime wordt uitgevoerd op Debian Buster. Het artefact bevat naar verwachting de juiste binaire Linux-bestanden. Wanneer u de --build local
vlag gebruikt in Core Tools, externe of verouderde hulpprogramma's, kan dit ertoe leiden dat oudere binaire bestanden worden gebruikt.
Zie Externe build - of buildeigen afhankelijkheden inschakelen om het probleem te verhelpen.
Het pakket is niet compatibel met de Python-interpreterversie
Ga naar .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info
of .python_packages/lib/site-packages/<package-name>-<version>-dist-info
. Open in de teksteditor het bestand METAGEGEVENS en controleer de sectie Classificaties: Als de sectie geen versie van het pakket bevat Python :: 3
, Python :: 3.6
, Python :: 3.7
of Python :: 3.8
, Python :: 3.9
is de pakketversie te oud of, waarschijnlijker, is deze al niet meer onderhouden.
U kunt de Python-versie van uw functie-app controleren vanuit Azure Portal. Navigeer naar de resourcepagina Overzicht van uw functie-app om de runtimeversie te vinden. De runtimeversie ondersteunt Python-versies, zoals beschreven in het overzicht van runtimeversies van Azure Functions.
Zie Uw pakket bijwerken naar de nieuwste versie of vervang het pakket door equivalenten om het probleem te verhelpen.
Het pakket conflicteert met andere pakketten
Als u hebt gecontroleerd of het pakket correct is opgelost met de juiste Linux-wielen, kan er een conflict zijn met andere pakketten. In bepaalde pakketten kan de PyPi-documentatie de incompatibele modules verduidelijken. U vindt bijvoorbeeld de volgende instructie in azure 4.0.0
:
Dit pakket is niet compatibel met azure-storage. Als u azure-storage hebt geïnstalleerd of azure 1.x/2.x hebt geïnstalleerd en azure-storage niet hebt verwijderd, moet u eerst azure-storage verwijderen.
U vindt de documentatie voor uw pakketversie in https://pypi.org/project/<package-name>/<package-version>
.
Zie Uw pakket bijwerken naar de nieuwste versie of vervang het pakket door equivalenten om het probleem te verhelpen.
Het pakket ondersteunt alleen Windows- en macOS-platforms
Open het requirements.txt
bestand met een teksteditor en controleer het pakket in https://pypi.org/project/<package-name>
. Sommige pakketten worden alleen uitgevoerd op Windows- en macOS-platforms. Pywin32 wordt bijvoorbeeld alleen uitgevoerd op Windows.
De Module Not Found
fout treedt mogelijk niet op wanneer u Windows of macOS gebruikt voor lokale ontwikkeling. Het pakket kan echter niet worden geïmporteerd in Azure Functions, die linux tijdens runtime gebruikt. Dit probleem wordt waarschijnlijk veroorzaakt door het gebruik van het exporteren pip freeze
van de virtuele omgeving naar requirements.txt vanaf uw Windows- of macOS-machine tijdens de initialisatie van het project.
Zie Het pakket vervangen door equivalenten of handwerk requirements.txt om het probleem te verhelpen.
ModuleNotFoundError beperken
Hieronder volgen mogelijke oplossingen voor modulegerelateerde problemen. Gebruik de eerder genoemde diagnoses om te bepalen welke van deze oplossingen u wilt proberen.
Externe build inschakelen
Zorg ervoor dat externe build is ingeschakeld. De manier waarop u ervoor zorgt, is afhankelijk van uw implementatiemethode.
Zorg ervoor dat de nieuwste versie van de Azure Functions-extensie voor Visual Studio Code is geïnstalleerd. Controleer of het .vscode/settings.json-bestand bestaat en dat het de instelling "azureFunctions.scmDoBuildDuringDeployment": true
bevat. Als dit niet het probleem is, maakt u het bestand met de azureFunctions.scmDoBuildDuringDeployment
instelling ingeschakeld en implementeert u het project opnieuw.
Systeemeigen afhankelijkheden bouwen
Zorg ervoor dat de nieuwste versies van Docker en Azure Functions Core Tools zijn geïnstalleerd. Ga naar de projectmap van uw lokale functie en gebruik func azure functionapp publish <app-name> --build-native-deps
deze voor implementatie.
Uw pakket bijwerken naar de nieuwste versie
Controleer in de nieuwste pakketversie van https://pypi.org/project/<package-name>
de sectie Classificaties: Het pakket moet OS Independent
, of compatibel zijn met POSIX
of POSIX :: Linux
in het besturingssysteem. De programmeertaal moet ook het volgende bevatten: Python :: 3
, Python :: 3.6
, Python :: 3.7
, Python :: 3.8
of Python :: 3.9
.
Als deze pakketitems juist zijn, kunt u het pakket bijwerken naar de nieuwste versie door de regel <package-name>~=<latest-version>
in requirements.txt te wijzigen.
Handwerk requirements.txt
Sommige ontwikkelaars gebruiken pip freeze > requirements.txt
om de lijst met Python-pakketten te genereren voor hun ontwikkelomgevingen. Hoewel dit gemak in de meeste gevallen moet werken, kunnen er problemen zijn in platformoverschrijdende implementatiescenario's, zoals het lokaal ontwikkelen van functies in Windows of macOS, maar publiceren naar een functie-app, die wordt uitgevoerd op Linux. In dit scenario pip freeze
kunnen onverwachte besturingssysteemspecifieke afhankelijkheden of afhankelijkheden voor uw lokale ontwikkelomgeving worden geïntroduceerd. Deze afhankelijkheden kunnen de Python-functie-app breken wanneer deze wordt uitgevoerd in Linux.
De aanbevolen procedure is om de importinstructie van elk .py-bestand in de broncode van uw project te controleren en vervolgens alleen de modules in het requirements.txt bestand in te checken. Deze praktijk garandeert dat de oplossing van pakketten correct kan worden verwerkt op verschillende besturingssystemen.
Het pakket vervangen door equivalenten
Bekijk eerst de nieuwste versie van het pakket in https://pypi.org/project/<package-name>
. Dit pakket heeft meestal een eigen GitHub-pagina. Ga naar de sectie Problemen op GitHub en zoek of uw probleem is opgelost. Als het probleem is opgelost, werkt u het pakket bij naar de nieuwste versie.
Soms is het pakket mogelijk geïntegreerd in de Standaardbibliotheek van Python (zoals pathlib
). Als dat het geval is, omdat we een bepaalde Python-distributie bieden in Azure Functions (Python 3.6, Python 3.7, Python 3.8 en Python 3.9), moet het pakket in uw requirements.txt-bestand worden verwijderd.
Als u echter merkt dat het probleem niet is opgelost en u een deadline hebt bereikt, raden we u aan om wat onderzoek uit te voeren om een vergelijkbaar pakket voor uw project te vinden. Meestal biedt de Python-community u een breed scala aan vergelijkbare bibliotheken die u kunt gebruiken.
Vlag voor isolatie van afhankelijkheden uitschakelen
Stel de toepassingsinstelling PYTHON_ISOLATE_WORKER_DEPENDENCIES in op een waarde van 0
.
Problemen oplossen: kan 'cygrpc' niet importeren
Deze sectie helpt u bij het oplossen van 'cygrpc'-gerelateerde fouten in uw Python-functie-app. Deze fouten resulteren doorgaans in het volgende Azure Functions-foutbericht:
Kan de naam 'cygrpc' niet importeren uit 'grpc._cython'
Deze fout treedt op wanneer een Python-functie-app niet kan worden gestart met een juiste Python-interpreter. De hoofdoorzaak voor deze fout is een van de volgende problemen:
- De Python-interpreter komt niet overeen met de architectuur van het besturingssysteem
- De Python-interpreter wordt niet ondersteund door Azure Functions Python Worker
De referentiefout 'cygrpc' vaststellen
Er zijn verschillende mogelijke oorzaken voor fouten die verwijzen cygrpc
, die in deze sectie worden beschreven.
De Python-interpreter komt niet overeen met de architectuur van het besturingssysteem
Dit komt waarschijnlijk doordat een 32-bits Python-interpreter wordt geïnstalleerd op uw 64-bits besturingssysteem.
Als u een x64-besturingssysteem gebruikt, moet u ervoor zorgen dat uw Python-versie 3.6, 3.7, 3.8 of 3.9-interpreter ook een 64-bits versie heeft.
U kunt de bitheid van uw Python-interpreter controleren door de volgende opdrachten uit te voeren:
Voer in Windows in PowerShell de opdracht uit py -c 'import platform; print(platform.architecture()[0])'
.
Voer op een Unix-achtige shell uit python3 -c 'import platform; print(platform.architecture()[0])'
.
Als er sprake is van een niet-overeenkomende Python-interpreter-bitness en de architectuur van het besturingssysteem, downloadt u een juiste Python-interpreter van Python Software Foundation.
De Python-interpreter wordt niet ondersteund door Azure Functions Python Worker
De Azure Functions Python Worker ondersteunt alleen specifieke Python-versies.
Controleer of uw Python-interpreter overeenkomt met de verwachte versie in py --version
Windows of python3 --version
in Unix-achtige systemen. Zorg ervoor dat het retourresultaat een van de ondersteunde Python-versies is.
Als uw Python-interpreterversie niet voldoet aan de vereisten voor Azure Functions, downloadt u in plaats daarvan een Python-interpreterversie die wordt ondersteund door Functions van de Python Software Foundation.
Problemen oplossen: Python is afgesloten met code 137
Code 137-fouten worden meestal veroorzaakt door onvoldoende geheugenproblemen in uw Python-functie-app. Als gevolg hiervan krijgt u het volgende Azure Functions-foutbericht:
Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: python afgesloten met code 137
Deze fout treedt op wanneer een Python-functie-app wordt gedwongen te beëindigen door het besturingssysteem met een SIGKILL
signaal. Dit signaal geeft meestal een out-of-memory-fout aan in uw Python-proces. Het Azure Functions-platform heeft een servicebeperking die alle functie-apps beëindigt die deze limiet overschrijden.
Als u het geheugenknelpunt in uw functie-app wilt analyseren, raadpleegt u De Python-functie-app profilen in de lokale ontwikkelomgeving.
Problemen oplossen: Python is afgesloten met code 139
Deze sectie helpt u bij het oplossen van fouten met segmentatiefouten in uw Python-functie-app. Deze fouten resulteren doorgaans in het volgende Azure Functions-foutbericht:
Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: python afgesloten met code 139
Deze fout treedt op wanneer een Python-functie-app wordt gedwongen te beëindigen door het besturingssysteem met een SIGSEGV
signaal. Dit signaal geeft een schending van de geheugensegmentatie aan, wat kan resulteren in een onverwachte lees- of schrijffunctie in een beperkt geheugengebied. In de volgende secties bieden we een lijst met veelvoorkomende hoofdoorzaken.
Een regressie van pakketten van derden
In het requirements.txt-bestand van uw functie-app wordt een losgemaakt pakket bijgewerkt naar de nieuwste versie tijdens elke implementatie naar Azure. Pakketupdates kunnen mogelijk regressies introduceren die van invloed zijn op uw app. Als u dergelijke problemen wilt herstellen, markeert u de importinstructies als commentaar, schakelt u de pakketverwijzingen uit of maak u het pakket vast aan een eerdere versie in requirements.txt.
Het uitkieken van een ongeldig PKL-bestand
Als uw functie-app de Python pickle-bibliotheek gebruikt om een Python-object uit een PKL-bestand te laden, is het mogelijk dat het bestand een ongeldige tekenreeks van bytes of een ongeldige adresverwijzing bevat. Als u wilt herstellen van dit probleem, probeert u de functie uit te pickle.load()
voeren als commentaar.
Pyodbc-verbindingsconflict
Als uw functie-app gebruikmaakt van het populaire PYODBC-databasestuurprogramma, is het mogelijk dat meerdere verbindingen zijn geopend binnen één functie-app. U kunt dit probleem voorkomen door het singleton-patroon te gebruiken en ervoor te zorgen dat er slechts één pyodbc-verbinding wordt gebruikt in de functie-app.
Synchronisatietriggers zijn mislukt
De fout Sync triggers failed
kan worden veroorzaakt door verschillende problemen. Een mogelijke oorzaak is een conflict tussen door de klant gedefinieerde afhankelijkheden en ingebouwde Python-modules wanneer uw functies worden uitgevoerd in een App Service-plan. Zie Pakketbeheer voor meer informatie.
Problemen oplossen: kan bestand of assembly niet laden
U kunt deze fout zien wanneer u lokaal werkt met behulp van het v2-programmeermodel. Deze fout wordt veroorzaakt door een bekend probleem dat in een toekomstige release moet worden opgelost.
Dit is een voorbeeldbericht voor deze fout:
DurableTask.Netherite.AzureFunctions: Kan bestand of assembly 'Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289' niet laden.
Het systeem kan het opgegeven bestand niet vinden.
De fout treedt op vanwege een probleem met de wijze waarop de extensiebundel in de cache is opgeslagen. Als u het probleem wilt oplossen, voert u deze opdracht uit met --verbose
meer informatie:
func host start --verbose
Het is waarschijnlijk dat u dit probleem met opslaan in de cache ziet wanneer u een logboek voor het laden van extensies ziet, zoals Loading startup extension <>
dat niet wordt gevolgd door Loaded extension <>
.
Ga als volgt te werk om het probleem op te lossen:
Zoek het pad door het
.azure-functions-core-tools
volgende uit te voeren:func GetExtensionBundlePath
Verwijder de
.azure-functions-core-tools
map.rm -r <insert path>/.azure-functions-core-tools
De cachemap wordt opnieuw gemaakt wanneer u Core Tools opnieuw uitvoert.
Problemen oplossen: kan de Azure Storage-verbinding niet oplossen
Mogelijk ziet u deze fout in uw lokale uitvoer als het volgende bericht:
Microsoft.Azure.WebJobs.Extensions.DurableTask: Kan de Azure Storage-verbinding met de naam 'Storage' niet oplossen.
Waarde kan niet null zijn. (Parameter 'provider')
Deze fout is het gevolg van hoe extensies lokaal uit de bundel worden geladen. Voer een van de volgende acties uit om deze fout op te lossen:
Gebruik een opslagemulator zoals Azurite. Deze optie is een goede optie wanneer u niet van plan bent om een opslagaccount in uw functietoepassing te gebruiken.
Maak een opslagaccount en voeg een verbindingsreeks toe aan de
AzureWebJobsStorage
omgevingsvariabele in het bestand localsettings.json. Gebruik deze optie wanneer u een opslagaccounttrigger of binding met uw toepassing gebruikt, of als u een bestaand opslagaccount hebt. Zie Een opslagaccount maken om aan de slag te gaan.
Functies zijn niet gevonden na de implementatie
Er zijn verschillende veelvoorkomende buildproblemen die ertoe kunnen leiden dat Python-functies niet door de host worden gevonden na een blijkbaar geslaagde implementatie:
De agentgroep moet worden uitgevoerd op Ubuntu om ervoor te zorgen dat pakketten correct worden hersteld vanuit de buildstap. Zorg ervoor dat uw implementatiesjabloon een Ubuntu-omgeving vereist voor het bouwen en implementeren.
Wanneer de functie-app zich niet in de hoofdmap van de bronopslagplaats bevindt, controleert u of de
pip install
stap verwijst naar de juiste locatie waar de.python_packages
map moet worden gemaakt. Houd er rekening mee dat deze locatie hoofdlettergevoelig is, zoals in dit opdrachtvoorbeeld:pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
De sjabloon moet een implementatiepakket genereren dat in kan worden geladen
/home/site/wwwroot
. In Azure Pipelines wordt dit gedaan door deArchiveFiles
taak.
Ontwikkelingsproblemen in Azure Portal
Houd bij het gebruik van Azure Portal rekening met deze bekende problemen en hun tijdelijke oplossingen:
- Er zijn algemene beperkingen voor het schrijven van uw functiecode in de portal. Zie Ontwikkelingsbeperkingen in Azure Portal voor meer informatie.
- Als u een functie uit een functie-app in de portal wilt verwijderen, verwijdert u de functiecode uit het bestand zelf. De knop Verwijderen werkt niet om de functie te verwijderen wanneer u het Python v2-programmeermodel gebruikt.
- Wanneer u een functie maakt in de portal, is het mogelijk dat u een ander hulpprogramma voor ontwikkeling gebruikt. Er zijn verschillende scenario's waarin u uw code niet kunt bewerken in de portal, inclusief wanneer er een syntaxisfout is gedetecteerd. In deze scenario's gebruikt u Visual Studio Code of Azure Functions Core Tools om uw functiecode te ontwikkelen en te publiceren.
Volgende stappen
Neem contact op met het Azure Functions-team als u het probleem niet kunt oplossen: