Problembehandlung von Python-Fehlern in Azure Functions

In diesem Artikel finden Sie Informationen zum Beheben von Fehlern mit Ihren Python-Funktionen in Azure Functions. In diesem Artikel werden die v1- und die v2-Programmiermodelle unterstützt. Wählen Sie das Modell, das Sie verwenden möchten, über den Selektor oben im Artikel aus.

Hinweis

Das Python v2-Programmiermodell wird nur in Version 4.x der Functions-Runtime unterstützt. Weitere Informationen finden Sie unter Einstellen von Runtimeversionen von Azure Functions als Ziel.

Dies sind die Abschnitte zur Problembehandlung für häufig auftretende Probleme in Python-Funktionen:

Problembehandlung: ModuleNotFoundError

Dieser Abschnitt unterstützt Sie dabei, modulbezogene Fehler in Ihrer Python-Funktions-App zu behandeln. Diese Fehler führen typischerweise zu der folgenden Azure Functions-Fehlermeldung:

Ausnahme: ModuleNotFoundError: Kein Modul namens 'module_name'.

Dieser Fehler erfolgt, wenn eine Python-Funktions-App ein Python-Modul nicht laden kann. Die Ursache für diesen Fehler ist einer der folgenden:

Anzeigen von Projektdateien

Um die tatsächliche Ursache Ihres Problems zu ermitteln, müssen Sie die Python-Projektdateien abrufen, die für Ihre Funktions-App ausgeführt werden. Wenn die Projektdateien nicht auf Ihrem lokalen Computer vorliegen, haben Sie zu deren Abruf folgende Möglichkeiten:

  • Wenn die Funktions-App eine App-Einstellung WEBSITE_RUN_FROM_PACKAGE aufweist und der zugehörige Wert eine URL ist, laden Sie die Datei herunter, indem Sie die URL kopieren und in Ihren Browser einfügen.
  • Wenn für die Funktions-App WEBSITE_RUN_FROM_PACKAGE auf 1 festgelegt ist, navigieren Sie zu https://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages, und laden Sie die Datei über die aktuelle href-URL herunter.
  • Wenn die Funktions-App keine der oben genannten App-Einstellungen aufweist, navigieren Sie zu https://<app-name>.scm.azurewebsites.net/api/settings, und suchen Sie unter SCM_RUN_FROM_PACKAGE nach der URL. Laden Sie die Datei herunter, indem Sie die URL kopieren und in Ihren Browser einfügen.
  • Wenn keiner der Vorschläge das Problem behebt, navigieren Sie zu https://<app-name>.scm.azurewebsites.net/DebugConsole, und zeigen Sie die Inhalte unter /home/site/wwwroot an.

In den verbleibenden Abschnitten des vorliegenden Artikels erhalten Sie Informationen zur Behebung der potenziellen Ursachen für diesen Fehler, indem Sie die Inhalte Ihrer Funktions-App untersuchen, die Problemursache beseitigen und so das Problem lösen.

Diagnose von „ModuleNotFoundError“

In diesem Abschnitt werden die potenziellen Ursachen modulbezogener Fehler beschrieben. Nachdem Sie die wahrscheinliche Ursache für einen Fehler kennen, können Sie ihn beheben.

Das Paket wurde nicht gefunden

Wechseln Sie zu .python_packages/lib/python3.6/site-packages/<package-name> oder .python_packages/lib/site-packages/<package-name>. Wenn der Dateipfad nicht vorhanden ist, wird der Fehler wahrscheinlich durch den fehlenden Pfad ausgelöst.

Die Verwendung eines Drittanbietertools oder eines veralteten Tools während der Bereitstellung kann zu diesem Problem führen.

Informationen zur Problembeseitigung finden Sie unter Aktivieren von Remotekompilierung oder Erstellen nativer Abhängigkeiten.

Das Paket wird nicht mit der richtigen Linux-Wheeldatei aufgelöst

Wechseln Sie zu .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info oder .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Verwenden Sie Ihren bevorzugten Text-Editor, um die Wheeldatei zu öffnen und den Abschnitt Tag: zu überprüfen. Das Problem kann darin bestehen, dass der Tagwert nicht linux enthält.

Python-Funktionen können nur unter Linux in Azure ausgeführt werden. Die Functions-Runtime v2.x wird unter Debian Stretch, die Runtime v3.x unter Debian Buster ausgeführt. Das Artefakt muss die richtigen Linux-Binärdateien enthalten. Wenn Sie das --build local-Flag in Core Tools oder Drittanbietertools bzw. veralteten Tools verwenden, kann dies dazu führen, dass ältere Binärdateien verwendet werden.

Informationen zur Problembeseitigung finden Sie unter Aktivieren von Remotekompilierung oder Erstellen nativer Abhängigkeiten.

Das Paket ist nicht mit der Version des Python-Interpreters kompatibel

Wechseln Sie zu .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info oder .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Öffnen Sie in Ihrem Text-Editor die METADATA-Datei, und überprüfen Sie den Classifiers:-Abschnitt. Wenn der Abschnitt weder Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8 oderPython :: 3.9 enthält, ist die Paketversion zu alt, oder (wahrscheinlicher) das Paket wird nicht mehr gewartet.

Sie können die Python-Version Ihrer Funktions-App im Azure-Portal überprüfen. Navigieren Sie zur Ressourcenseite Übersicht Ihrer Funktions-App, um die Runtimeversion zu ermitteln. Die Runtimeversion unterstützt Python-Versionen, wie in der Übersicht über Azure Functions Runtimeversionen beschrieben.

Informationen zur Problembehebung finden Sie unter Aktualisieren Ihres Pakets auf die aktuelle Version oder Ersetzen des Pakets durch äquivalente Pakete.

Das Paket führt zu einem Konflikt mit anderen Paketen

Wenn Sie sichergestellt haben, dass das Paket mit der geeigneten Linux-Wheeldatei ordnungsgemäß aufgelöst wird, liegt möglicherweise ein Konflikt mit anderen Paketen vor. In bestimmten Paketen können nicht kompatible Module anhand der PyPi-Dokumentation ermittelt werden. In azure 4.0.0 finden Sie beispielsweise die folgende Anweisung:

Dieses Paket ist nicht mit azure-storage kompatibel. Wenn Sie azure-storage installiert oder wenn Sie azure 1.x/2.x installiert und azure-storage nicht deinstalliert haben, müssen Sie zuerst azure-storage deinstallieren.

Sie finden die Dokumentation für Ihre Paketversion in https://pypi.org/project/<package-name>/<package-version>.

Informationen zur Problembehebung finden Sie unter Aktualisieren Ihres Pakets auf die aktuelle Version oder Ersetzen des Pakets durch äquivalente Pakete.

Das Paket unterstützt nur Windows- und macOS-Plattformen

Öffnen Sie requirements.txt mit einem Text-Editor, und überprüfen Sie das Paket in https://pypi.org/project/<package-name>. Einige Pakete können nur auf Windows- oder macOS-Plattformen ausgeführt werden. Beispielsweise kann pywin32 nur unter Windows ausgeführt werden.

Der Fehler Module Not Found tritt möglicherweise nicht auf, wenn Sie Windows oder macOS für die lokale Bereitstellung verwenden. Das Paket kann jedoch nicht in Azure Functions importiert werden, weil Functions zur Laufzeit Linux verwendet. Die wahrscheinliche Ursache für dieses Problem ist die Verwendung von pip freeze, um während der Projektinitialisierung von Ihrem Windows- oder macOS-Computer aus die virtuelle Umgebung in die Datei requirements.txt zu exportieren.

Informationen zur Problembehebung finden Sie unter Ersetzen des Pakets durch äquivalente Pakete oder Manuelles Erstellen von „requirements.txt“.

Beheben von „ModuleNotFoundError“

Nachfolgend werden Möglichkeiten zum Beheben modulbezogener Probleme beschrieben. Verwenden Sie die zuvor erwähnten Diagnoseinformationen, um zu entscheiden, welche Entschärfung verwendet werden soll.

Aktivieren der Remotekompilierung

Stellen Sie sicher, dass die Remotekompilierung aktiviert ist. Die Vorgehensweise bei der Sicherstellung hängt von Ihrer Bereitstellungsmethode ab.

Stellen Sie sicher, dass die aktuelle Version der Azure Functions-Erweiterung für Visual Studio Code installiert ist. Vergewissern Sie sich, dass die Datei .vscode/settings.json vorhanden ist und die Einstellung "azureFunctions.scmDoBuildDuringDeployment": true enthält. Wenn dies nicht der Fall ist, erstellen Sie diese Datei mit aktivierter azureFunctions.scmDoBuildDuringDeployment-Einstellung, und stellen Sie das Projekt dann erneut bereit.

Erstellen nativer Abhängigkeiten

Stellen Sie sicher, dass die neueste Version von Docker und Azure Functions Core Tools installiert ist. Wechseln Sie zu Ihrem lokalen Ordner für das Funktionsprojekt, und verwenden Sie func azure functionapp publish <app-name> --build-native-deps für die Bereitstellung.

Aktualisieren Ihres Pakets auf die aktuelle Version

Überprüfen Sie den Abschnitt Classifiers: in der neuesten Paketversion von https://pypi.org/project/<package-name>. Das Paket sollte als OS Independent gekennzeichnet oder mit POSIX oder POSIX :: Linux in Betriebssystem kompatibel sein. Darüber hinaus muss die Programmiersprache Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8 oder Python :: 3.9 enthalten.

Wenn diese Paketelemente richtig sind, können Sie das Paket auf die aktuelle Version aktualisieren, indem Sie die Zeile <package-name>~=<latest-version> in requirements.txt ändern.

Manuelles Erstellen von „requirements.txt“

Einige Entwickler verwenden pip freeze > requirements.txt, um die Liste der Python-Pakete für ihre Entwicklungsumgebungen zu generieren. Wenngleich diese Vorgehensweise in den meisten Fällen funktionieren sollte, kann sie in plattformübergreifenden Bereitstellungsszenarien zu Problemen führen – wenn beispielsweise Funktionen lokal unter Windows oder macOS entwickelt werden, aber in einer Funktions-App veröffentlicht werden, die unter Linux ausgeführt wird. In diesem Szenario kann pip freeze zu unerwarteten betriebssystemspezifischen Abhängigkeiten oder zu Abhängigkeiten für Ihre lokale Entwicklungsumgebung führen. Diese Abhängigkeiten können die Lauffähigkeit der Python-Funktions-App bei Ausführung unter Linux beeinträchtigen.

Die beste Vorgehensweise besteht darin, die Importanweisung aus jeder PY-Datei im Quellcode Ihres Projekts zu überprüfen und dann nur die Module in der Datei requirements.txt einzuchecken. Auf diese Weise wird garantiert, dass die Paketauflösung unter unterschiedlichen Betriebssystemen ordnungsgemäß ausgeführt werden kann.

Ersetzen der Pakete durch äquivalente Pakete

Werfen Sie zunächst einen Blick auf die neueste Version des Pakets in https://pypi.org/project/<package-name>. Dieses Paket verfügt in der Regel über eine eigene GitHub-Seite. Navigieren Sie zum Abschnitt Issues (Probleme) auf GitHub, und überprüfen Sie, ob Ihr Problem behoben wurde. Wenn es behoben wurde, aktualisieren Sie das Paket auf die neueste Version.

In einigen Fällen wurde das Paket möglicherweise in die Python-Standardbibliothek (z. B. pathlib) integriert. Wenn dies der Fallist: Da wir eine bestimmte Python-Distribution in Azure Functions (Python 3.6, Python 3.7, Python 3.8 und Python 3.9) zur Verfügung stellen, muss das Paket ggf. aus requirements.txt entfernt werden.

Wenn Sie jedoch feststellen, dass das Problem nicht behoben wurde, und Sie eine Frist einhalten müssen, sollten Sie nach einem ähnlichen Paket für Ihr Projekt suchen. In der Regel stellt die Python-Community eine Vielzahl ähnlicher Bibliotheken zur Verfügung, die Sie nutzen können.

Deaktivieren des Flags für die Abhängigkeitsisolierung

Setzen Sie die Anwendungseinstellung PYTHON_ISOLATE_WORKER_DEPENDENCIES auf den Wert 0.


Problembehandlung: Fehler beim Importieren von „cygrpc“

Dieser Abschnitt unterstützt Sie dabei, Fehler im Zusammenhang mit „cygrpc“ in Ihrer Python-Funktions-App zu behandeln. Diese Fehler führen typischerweise zu der folgenden Azure Functions-Fehlermeldung:

Name 'cygrpc' kann nicht aus 'grpc._cython' importiert werden

Dieser Fehler erfolgt, wenn eine Python-Funktions-App nicht mit einem funktionsfähigen Python-Interpreter gestartet werden kann. Die Ursache für diesen Fehler ist einer der folgenden:

Diagnose des „cygrpc“-Verweisfehlers

Es gibt mehrere mögliche Ursachen für Fehler, die auf cygrpc verweisen. Diese werden im folgenden Abschnitt beschrieben.

Der Python-Interpreter stimmt nicht mit der Betriebssystemarchitektur überein.

Dieser Konflikt ist höchstwahrscheinlich darauf zurückzuführen, dass ein 32-Bit-Python-Interpreter in Ihrem 64-Bit-Betriebssystem installiert ist.

Wenn Sie mit einem x64-Betriebssystem arbeiten, stellen Sie sicher, dass Ihr Interpreter der Python-Version 3.6, 3.7, 3.8 oder 3.9 auch in einer 64-Bit-Version ausgeführt wird.

Sie können die Bitanzahl Ihres Python-Interpreters durch Ausführen der folgenden Befehle überprüfen:

Unter Windows in PowerShell führen Sie py -c 'import platform; print(platform.architecture()[0])' aus.

Führen Sie in einer Unix-Shell python3 -c 'import platform; print(platform.architecture()[0])' aus.

Wenn die Bitanzahl des Python-Interpreters und die Betriebssystemarchitektur nicht übereinstimmen, laden Sie einen funktionsfähigen Python-Interpreter von Python Software Foundation herunter.

Der Python-Interpreter wird vom Python-Worker von Azure Functions nicht unterstützt

Der Python-Worker von Azure Functions unterstützt nur bestimmte Python-Versionen.

Überprüfen Sie über py --version unter Windows oder python3 --version in Unix-ähnlichen Systemen, ob Ihr Python-Interpreter mit der erwarteten Version übereinstimmt. Stellen Sie sicher, dass das Rückgabeergebnis eine der unterstützten Python-Versionen ist.

Wenn die Version Ihres Python-Interpreters nicht den Anforderungen für Azure Functions entspricht, laden Sie stattdessen von der Python Software Foundation eine Python-Interpreterversion herunter, die von Functions unterstützt wird.


Problembehandlung: Python beendet mit Code 137

Code 137-Fehler werden typischerweise durch Out-of-Memory-Probleme in Ihrer Python-Functions-App verursacht. Als Ergebnis erhalten Sie die folgende Fehlermeldung von Azure Functions:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: Python wurde mit Code 137 beendet

Dieser Fehler tritt auf, wenn die Beendigung einer Python-Funktions-App durch Betriebssystem mit einem SIGKILL-Signal erzwungen wird. Dieses Signal weist in der Regel auf einen Fehler wegen nicht genügend Arbeitsspeichers in Ihrem Python-Prozess hin. Die Azure Functions-Plattform verfügt über eine Diensteinschränkung, die alle Functions-Apps beendet, die diesen Grenzwert überschreiten.

Informationen zum Analysieren der Speicherengpässe in Ihrer Funktions-App finden Sie unter Erstellen eines Profils für eine Python-Funktions-App in einer lokalen Entwicklungsumgebung.


Problembehandlung: Python mit Code 139 beendet

Dieser Abschnitt hilft Ihnen bei der Behebung von Segmentierungsfehlern in Ihrer Python-Funktions-App. Diese Fehler führen typischerweise zu der folgenden Azure Functions-Fehlermeldung:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: Python wurde mit Code 139 beendet

Dieser Fehler tritt auf, wenn die Beendigung einer Python-Funktions-App durch Betriebssystem mit einem SIGSEGV-Signal erzwungen wird. Dieses Signal gibt eine Verletzung der Arbeitsspeichersegmentierung an, die durch unerwartetes Lesen aus einem oder Schreiben in einen eingeschränkten Speicherbereich verursacht werden kann. In den folgenden Abschnitten wird eine Liste der allgemeinen Hauptursachen bereitgestellt.

Eine Regression von Drittanbieter-Paketen

In der Datei requirements.txt Ihrer Funktions-App wird ein nicht angeheftetes Paket während jeder Bereitstellung in Azure auf die neueste Version aktualisiert. Paketupdates können Regressionen einführen, die sich auf Ihre App auswirken. Für die Wiederherstellung nach solchen Problemen kommentieren Sie in requirements.txt die import-Anweisungen aus, deaktivieren die Paketverweise oder heften das Paket an eine frühere Version an.

Entpickeln aus einer fehlerhaften .pkl-Datei

Wenn Ihre Funktions-App die Python-Pickel-Bibliothek verwendet, um das Python-Objekt aus einer PKL-Datei zu laden, ist es möglich, dass die PKL-Datei eine nicht wohlgeformte Bytezeichenfolge oder einen ungültigen Adressverweis enthält. Um dieses Problem zu beheben, versuchen Sie, die Funktion pickle.load() auszukommentieren.

Kollision von Pyodbc-Verbindungen

Wenn Ihre Funktions-App den gängigen ODBC-Datenbanktreiber pyodbcverwendet, ist es möglich, dass mehrere Verbindungen innerhalb einer einzelnen Funktions-App geöffnet werden. Um dieses Problem zu vermeiden, verwenden Sie das Singleton-Muster, und stellen Sie sicher, dass nur eine pyodbc-Verbindung in der gesamten Funktions-App verwendet wird.


Fehler bei Synchronisierungstriggern

Der Fehler Sync triggers failed kann durch mehrere Probleme verursacht werden. Eine mögliche Ursache ist ein Konflikt zwischen benutzerdefinierten Abhängigkeiten und integrierten Python-Modulen, wenn Ihre Funktionen in einem App Service-Plan ausgeführt werden. Weitere Informationen finden Sie unter Paketverwaltung.


Problembehandlung: Datei oder Assembly konnte nicht geladen werden

Dieser Fehler wird bei einer lokalen Ausführung mit dem v2-Programmiermodell angezeigt. Ursache für diesen Fehler ist ein bekanntes Problem, das in einem bevorstehenden Release behoben wird.

Dies ist eine Beispielmeldung für diesen Fehler:

DurableTask.Netherite.AzureFunctions: Datei oder Assembly 'Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289 konnte nicht geladen werden.
Die angegebene Datei wurde nicht gefunden.

Dieser Fehler kann durch ein Problem bei der Zwischenspeicherung des Erweiterungspakets verursacht werden. Um das Problem zu beheben, führen Sie diesen Befehl mit --verbose aus, um weitere Details anzuzeigen:

func host start --verbose

Sehr wahrscheinlich wird dieses Zwischenspeicherungsproblem angezeigt. In diesem Fall sehen Sie ein Erweiterungsladeprotokoll wie Loading startup extension <>, auf das nicht Loaded extension <> folgt.

So beheben Sie dieses Problem:

  1. Suchen Sie den Pfad .azure-functions-core-tools, indem Sie Folgendes ausführen:

    func GetExtensionBundlePath
    
  2. Löschen des Verzeichnisses .azure-functions-core-tools.

    rm -r <insert path>/.azure-functions-core-tools
    

Das Cacheverzeichnis wird neu erstellt, wenn Sie Core Tools erneut ausführen.

Problembehandlung: Azure Storage-Verbindung kann nicht aufgelöst werden

Möglicherweise wird dieser Fehler in Ihrer lokalen Ausgabe als folgende Meldung angezeigt:

Microsoft.Azure.WebJobs.Extensions.DurableTask: Azure Storage-Verbindung namens 'Speicher' kann nicht aufgelöst werden
Wert darf nicht NULL sein. (provider-Parameter)

Dieser Fehler ist auf die Art und Weise zurückzuführen, wie Erweiterungen lokal aus dem Paket geladen werden. Führen Sie zum Beheben dieses Fehlers eine der folgenden Aktionen aus:

  • Verwenden Sie einen Speicheremulator wie Azurite. Dies ist eine gute Option, wenn Sie nicht planen, ein Speicherkonto in Ihrer Funktionsanwendung zu verwenden.

  • Erstellen Sie ein Speicherkonto, und fügen Sie der AzureWebJobsStorage-Umgebungsvariablen in der Datei localsettings.json eine Verbindungszeichenfolge hinzu. Verwenden Sie diese Option, wenn Sie einen Speicherkontotrigger oder eine -bindung mit Ihrer Anwendung verwenden, oder wenn Sie über ein vorhandenes Speicherkonto verfügen. Informationen zu den ersten Schritten finden Sie unter Speicherkonto erstellen.

Funktionen nach der Bereitstellung nicht gefunden

Es gibt mehrere häufige Buildprobleme, die dazu führen können, dass Python-Funktionen nach einer scheinbar erfolgreichen Bereitstellung vom Host nicht gefunden werden:

  • Der Agentpool muss auf Ubuntu ausgeführt werden, um sicherzustellen, dass Pakete ordnungsgemäß aus dem Buildschritt wiederhergestellt werden. Stellen Sie sicher, dass Ihre Bereitstellungsvorlage eine Ubuntu-Umgebung für Build und Bereitstellung benötigt.

  • Wenn sich die Funktions-App nicht im Stammverzeichnis des Quell-Repositorys befindet, stellen Sie sicher, dass der pip install Schritt auf den richtigen Speicherort verweist, an dem der .python-packages Ordner erstellt werden soll. Beachten Sie, dass bei diesem Speicherort die Groß-/Kleinschreibung beachtet wird, z. B. in diesem Befehlsbeispiel:

    pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
    
  • Die Vorlage muss ein Bereitstellungspaket generieren, in das /home/site/wwwroot geladen werden kann. In Azure Pipelines erfolgt dies durch die ArchiveFiles Aufgabe.

Entwicklungsprobleme im Azure-Portal

Berücksichtigen Sie bei Verwendung des Azure-Portals die folgenden bekannten Probleme und deren Problemumgehungen:

  • Um eine Funktion aus einer Funktions-App im Portal zu löschen, entfernen Sie den Funktionscode aus der Datei selbst. Mit der Schaltfläche Löschen kann die Funktion bei Verwendung des Python v2-Programmiermodells nicht entfernt werden.
  • Beim Erstellen einer Funktion im Portal werden Sie möglicherweise aufgefordert, ein anderes Tool für die Entwicklung zu verwenden. Es gibt mehrere Szenarien, in denen Sie Ihren Code im Portal nicht bearbeiten können, z. B. bei der Erkennung eines Syntaxfehlers. Verwenden Sie in diesen Szenarien Visual Studio Code oder Azure Functions Core Tools, um Ihren Funktionscode zu entwickeln und zu veröffentlichen.

Nächste Schritte

Wenn Sie Ihr Problem nicht lösen können, wenden Sie sich an das Azure Functions-Team: