Rozwiązywanie problemów z błędami języka Python w usłudze Azure Functions

Ten artykuł zawiera informacje ułatwiające rozwiązywanie problemów z błędami funkcji języka Python w usłudze Azure Functions. Ten artykuł obsługuje modele programowania w wersji 1 i 2. Wybierz model, którego chcesz użyć z selektora w górnej części artykułu.

Uwaga

Model programowania języka Python w wersji 2 jest obsługiwany tylko w środowisku uruchomieniowym funkcji 4.x. Aby uzyskać więcej informacji, zobacz Omówienie wersji środowiska uruchomieniowego usługi Azure Functions.

Poniżej przedstawiono sekcje rozwiązywania problemów dotyczące typowych problemów w funkcjach języka Python:

Rozwiązywanie problemów: ModuleNotFoundError

Ta sekcja ułatwia rozwiązywanie problemów z błędami związanymi z modułami w aplikacji funkcji języka Python. Te błędy zwykle powodują następujący komunikat o błędzie usługi Azure Functions:

Wyjątek: ModuleNotFoundError: brak modułu o nazwie "module_name".

Ten błąd występuje, gdy aplikacja funkcji języka Python nie może załadować modułu języka Python. Główną przyczyną tego błędu jest jeden z następujących problemów:

Wyświetlanie plików projektu

Aby zidentyfikować rzeczywistą przyczynę problemu, należy pobrać pliki projektu języka Python uruchamiane w aplikacji funkcji. Jeśli nie masz plików projektu na komputerze lokalnym, możesz je uzyskać w jeden z następujących sposobów:

  • Jeśli aplikacja funkcji ma WEBSITE_RUN_FROM_PACKAGE ustawienie aplikacji, a jej wartość jest adresem URL, pobierz plik, kopiując i wklejając adres URL w przeglądarce.
  • Jeśli aplikacja funkcji ma WEBSITE_RUN_FROM_PACKAGE ustawioną wartość 1, przejdź do https://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages strony i pobierz plik z najnowszego href adresu URL.
  • Jeśli aplikacja funkcji nie ma żadnych poprzednich ustawień aplikacji, przejdź do https://<app-name>.scm.azurewebsites.net/api/settings adresu URL w obszarze SCM_RUN_FROM_PACKAGE. Pobierz plik, kopiując i wklejając adres URL do przeglądarki.
  • Jeśli sugestie rozwiążą ten problem, przejdź do https://<app-name>.scm.azurewebsites.net/DebugConsole strony i wyświetl zawartość w obszarze /home/site/wwwroot.

Pozostała część tego artykułu pomaga rozwiązać problemy z potencjalnymi przyczynami tego błędu, sprawdzając zawartość aplikacji funkcji, identyfikując główną przyczynę i usuwając konkretny problem.

Diagnozowanie błędu ModuleNotFoundError

Ta sekcja zawiera szczegółowe informacje o potencjalnych głównych przyczynach błędów związanych z modułem. Po zapoznaniu się z prawdopodobną główną przyczyną można przejść do powiązanego ograniczenia ryzyka.

Nie można odnaleźć pakietu

Przejdź do .python_packages/lib/python3.6/site-packages/<package-name> lub .python_packages/lib/site-packages/<package-name>. Jeśli ścieżka pliku nie istnieje, ta brakująca ścieżka prawdopodobnie jest główną przyczyną.

Użycie narzędzi innych firm lub nieaktualnych podczas wdrażania może spowodować ten problem.

Aby rozwiązać ten problem, zobacz Włączanie zdalnej kompilacji lub Kompilacja zależności natywnych.

Pakiet nie jest rozpoznawany przy użyciu odpowiedniego koła systemu Linux

Przejdź do .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info lub .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Użyj ulubionego edytora tekstów, aby otworzyć plik wheel i sprawdzić sekcję Tag: . Problem może polegać na tym, że wartość tagu nie zawiera systemu Linux.

Funkcje języka Python działają tylko w systemie Linux na platformie Azure. Środowisko uruchomieniowe usługi Functions w wersji 2.x działa w systemie Debian Stretch, a środowisko uruchomieniowe v3.x działa w systemie Debian Buster. Oczekuje się, że artefakt będzie zawierać poprawne pliki binarne systemu Linux. Jeśli używasz flagi --build local w narzędziach Core Tools, innych firm lub nieaktualnych narzędziach, może to spowodować użycie starszych plików binarnych.

Aby rozwiązać ten problem, zobacz Włączanie zdalnej kompilacji lub Kompilacja zależności natywnych.

Pakiet jest niezgodny z wersją interpretera języka Python

Przejdź do .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info lub .python_packages/lib/site-packages/<package-name>-<version>-dist-info. W edytorze tekstów otwórz plik METADATA i sprawdź sekcję Klasyfikatory: . Jeśli sekcja nie zawiera Python :: 3elementów , , Python :: 3.6Python :: 3.7, Python :: 3.8lub Python :: 3.9, wersja pakietu jest zbyt stara lub prawdopodobnie nie jest już konserwacyjna.

Możesz sprawdzić wersję języka Python aplikacji funkcji w witrynie Azure Portal. Przejdź do strony zasobów Przegląd aplikacji funkcji, aby znaleźć wersję środowiska uruchomieniowego. Wersja środowiska uruchomieniowego obsługuje wersje języka Python zgodnie z opisem w omówieniu wersji środowiska uruchomieniowego usługi Azure Functions.

Aby rozwiązać ten problem, zobacz Aktualizowanie pakietu do najnowszej wersji lub Zastępowanie pakietu odpowiednikami.

Pakiet powoduje konflikt z innymi pakietami

Jeśli sprawdzono, że pakiet został poprawnie rozwiązany z odpowiednimi kołami systemu Linux, może wystąpić konflikt z innymi pakietami. W niektórych pakietach dokumentacja PyPi może wyjaśnić niezgodne moduły. Na przykład w azure 4.0.0pliku znajduje się następująca instrukcja:

Ten pakiet nie jest zgodny z usługą azure-storage. Jeśli zainstalowano usługę Azure-Storage lub zainstalowano platformę Azure 1.x/2.x i nie odinstalowujesz usługi Azure-Storage, musisz najpierw odinstalować usługę Azure-Storage.

Dokumentację dotyczącą wersji pakietu można znaleźć w pliku https://pypi.org/project/<package-name>/<package-version>.

Aby rozwiązać ten problem, zobacz Aktualizowanie pakietu do najnowszej wersji lub Zastępowanie pakietu odpowiednikami.

Pakiet obsługuje tylko platformy windows i macOS

Otwórz plik za requirements.txt pomocą edytora tekstów i sprawdź pakiet w pliku https://pypi.org/project/<package-name>. Niektóre pakiety działają tylko na platformach Windows i macOS. Na przykład narzędzie pywin32 działa tylko w systemie Windows.

Błąd Module Not Found może nie wystąpić, gdy używasz systemu Windows lub macOS na potrzeby programowania lokalnego. Jednak importowanie pakietu w usłudze Azure Functions nie powiedzie się, co używa systemu Linux w czasie wykonywania. Ten problem może być spowodowany użyciem funkcji pip freeze eksportowania środowiska wirtualnego do requirements.txt z komputera z systemem Windows lub macOS podczas inicjowania projektu.

Aby rozwiązać ten problem, zobacz Zastępowanie pakietu odpowiednikami lub requirements.txt Handcraft.

Eliminowanie błędu ModuleNotFoundError

Poniżej przedstawiono potencjalne środki zaradcze w przypadku problemów związanych z modułem. Użyj wcześniej wymienionych diagnoz, aby określić, które z tych środków zaradcze należy spróbować.

Włączanie kompilacji zdalnej

Upewnij się, że kompilacja zdalna jest włączona. Sposób, w jaki upewnisz się, zależy od metody wdrażania.

Upewnij się, że zainstalowano najnowszą wersję rozszerzenia usługi Azure Functions dla programu Visual Studio Code . Sprawdź, czy plik vscode/settings.json istnieje i zawiera ustawienie "azureFunctions.scmDoBuildDuringDeployment": true. Jeśli tak nie jest, utwórz plik z azureFunctions.scmDoBuildDuringDeployment włączonym ustawieniem, a następnie ponownie wdróż projekt.

Tworzenie zależności natywnych

Upewnij się, że zainstalowano najnowsze wersje narzędzi Docker i Azure Functions Core Tools . Przejdź do folderu projektu funkcji lokalnej i użyj polecenia func azure functionapp publish <app-name> --build-native-deps do wdrożenia.

Aktualizowanie pakietu do najnowszej wersji

W najnowszej https://pypi.org/project/<package-name>wersji pakietu programu sprawdź sekcję Klasyfikatory: . Pakiet powinien być OS Independentzgodny z POSIX systemem operacyjnym lub POSIX :: Linux w systemie operacyjnym. Ponadto język programowania powinien zawierać: Python :: 3, , Python :: 3.6Python :: 3.7, Python :: 3.8lub Python :: 3.9.

Jeśli te elementy pakietu są poprawne, możesz zaktualizować pakiet do najnowszej wersji, zmieniając wiersz <package-name>~=<latest-version> w requirements.txt.

Requirements.txt rękoczynów

Niektórzy deweloperzy używają pip freeze > requirements.txt metody do generowania listy pakietów języka Python dla swoich środowisk programistycznych. Chociaż ta wygoda powinna działać w większości przypadków, mogą występować problemy w scenariuszach wdrażania międzyplatformowych, takich jak tworzenie funkcji lokalnie w systemie Windows lub macOS, ale publikowanie w aplikacji funkcji, która działa w systemie Linux. W tym scenariuszu pip freeze można wprowadzić nieoczekiwane zależności lub zależności specyficzne dla systemu operacyjnego dla lokalnego środowiska deweloperskiego. Te zależności mogą uszkodzić aplikację funkcji języka Python, gdy jest uruchomiona w systemie Linux.

Najlepszym rozwiązaniem jest sprawdzenie instrukcji import z każdego pliku .py w kodzie źródłowym projektu, a następnie zaewidencjonowania tylko modułów w pliku requirements.txt . Ta praktyka gwarantuje, że rozpoznawanie pakietów może być prawidłowo obsługiwane w różnych systemach operacyjnych.

Zastąp pakiet odpowiednikami

Najpierw zapoznaj się z najnowszą wersją pakietu w pliku https://pypi.org/project/<package-name>. Ten pakiet zazwyczaj ma własną stronę usługi GitHub. Przejdź do sekcji Problemy w witrynie GitHub i wyszukaj, czy problem został rozwiązany. Jeśli został naprawiony, zaktualizuj pakiet do najnowszej wersji.

Czasami pakiet mógł zostać zintegrowany z biblioteką Standardowa języka Python (na przykład pathlib). Jeśli tak, ponieważ udostępniamy pewną dystrybucję języka Python w usłudze Azure Functions (Python 3.6, Python 3.7, Python 3.8 i Python 3.9), pakiet w pliku requirements.txt powinien zostać usunięty.

Jeśli jednak okaże się, że problem nie został rozwiązany i jesteś w terminie, zachęcamy do wykonania pewnych badań w celu znalezienia podobnego pakietu dla projektu. Zazwyczaj społeczność języka Python udostępnia szeroką gamę podobnych bibliotek, których można używać.

Wyłącz flagę izolacji zależności

Ustaw ustawienie aplikacji PYTHON_ISOLATE_WORKER_DEPENDENCIES na wartość 0.


Rozwiązywanie problemów: nie można zaimportować elementu "cygrpc"

Ta sekcja ułatwia rozwiązywanie problemów z błędami cygrpc w aplikacji funkcji języka Python. Te błędy zwykle powodują następujący komunikat o błędzie usługi Azure Functions:

Nie można zaimportować nazwy "cygrpc" z "grpc._cython"

Ten błąd występuje, gdy nie można uruchomić aplikacji funkcji języka Python z odpowiednim interpreterem języka Python. Główną przyczyną tego błędu jest jeden z następujących problemów:

Diagnozowanie błędu odwołania "cygrpc"

Istnieje kilka możliwych przyczyn błędów, które odwołują się cygrpcdo elementu , które zostały szczegółowo opisane w tej sekcji.

Interpreter języka Python niezgodnie z architekturą systemu operacyjnego

Ta niezgodność jest najprawdopodobniej spowodowana zainstalowaniem 32-bitowego interpretera języka Python w 64-bitowym systemie operacyjnym.

Jeśli korzystasz z systemu operacyjnego x64, upewnij się, że interpreter języka Python w wersji 3.6, 3.7, 3.8 lub 3.9 jest również w wersji 64-bitowej.

Bitność interpretera języka Python można sprawdzić, uruchamiając następujące polecenia:

W systemie Windows w programie PowerShell uruchom polecenie py -c 'import platform; print(platform.architecture()[0])'.

W powłoce przypominającej system Unix uruchom polecenie python3 -c 'import platform; print(platform.architecture()[0])'.

Jeśli występuje niezgodność między bitowością interpretera języka Python a architekturą systemu operacyjnego, pobierz odpowiedni interpreter języka Python z programu Python Software Foundation.

Interpreter języka Python nie jest obsługiwany przez proces roboczy języka Python usługi Azure Functions

Proces roboczy języka Python usługi Azure Functions obsługuje tylko określone wersje języka Python.

Sprawdź, czy interpreter języka Python jest zgodny z oczekiwaną wersją py --version w systemach Windows lub python3 --version Unix. Upewnij się, że zwracany wynik jest jedną z obsługiwanych wersji języka Python.

Jeśli wersja interpretera języka Python nie spełnia wymagań usługi Azure Functions, zamiast tego pobierz wersję interpretera języka Python obsługiwaną przez usługę Functions z programu Python Software Foundation.


Rozwiązywanie problemów: język Python zakończył działanie z kodem 137

Błędy kodu 137 są zwykle spowodowane problemami braku pamięci w aplikacji funkcji języka Python. W związku z tym zostanie wyświetlony następujący komunikat o błędzie usługi Azure Functions:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: python zakończył działanie z kodem 137

Ten błąd występuje, gdy aplikacja funkcji języka Python jest zmuszona do zakończenia działania przez system operacyjny za pomocą sygnału SIGKILL . Ten sygnał zwykle wskazuje błąd braku pamięci w procesie języka Python. Platforma Azure Functions ma ograniczenie usługi, które przerywa wszystkie aplikacje funkcji, które przekraczają ten limit.

Aby przeanalizować wąskie gardło pamięci w aplikacji funkcji, zobacz Profile Python function app in local development environment (Profilowanie aplikacji funkcji języka Python w lokalnym środowisku programistycznym).


Rozwiązywanie problemów: język Python zakończył działanie z kodem 139

Ta sekcja ułatwia rozwiązywanie problemów z błędami błędów segmentacji w aplikacji funkcji języka Python. Te błędy zwykle powodują następujący komunikat o błędzie usługi Azure Functions:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: python zakończył działanie z kodem 139

Ten błąd występuje, gdy aplikacja funkcji języka Python jest zmuszona do zakończenia działania przez system operacyjny za pomocą sygnału SIGSEGV . Ten sygnał wskazuje naruszenie segmentacji pamięci, co może wynikać z nieoczekiwanego odczytu lub zapisu w regionie pamięci z ograniczeniami. W poniższych sekcjach przedstawiono listę typowych głównych przyczyn.

Regresja pakietów innych firm

W pliku requirements.txt aplikacji funkcji odpięty pakiet zostanie uaktualniony do najnowszej wersji podczas każdego wdrożenia na platformie Azure. Aktualizacje pakietów mogą potencjalnie wprowadzać regresje wpływające na aplikację. Aby odzyskać sprawę po takich problemach, oznacz jako komentarz instrukcje importu, wyłącz odwołania do pakietu lub przypnij pakiet do poprzedniej wersji w requirements.txt.

Unpickling z źle sformułowanego pliku pkl

Jeśli aplikacja funkcji używa biblioteki pickle języka Python do ładowania obiektu języka Python z pliku pkl , możliwe, że plik zawiera źle sformułowany ciąg bajtów lub nieprawidłowe odwołanie do adresu. Aby rozwiązać ten problem, spróbuj dodać komentarz do pickle.load() funkcji.

Kolizja połączenia Pyodbc

Jeśli aplikacja funkcji korzysta z popularnego sterownika bazy danych ODBC pyodbc, istnieje możliwość, że wiele połączeń jest otwartych w ramach jednej aplikacji funkcji. Aby uniknąć tego problemu, użyj wzorca pojedynczego i upewnij się, że w aplikacji funkcji jest używane tylko jedno połączenie pyodbc.


Wyzwalacze synchronizacji nie powiodły się

Sync triggers failed Błąd może być spowodowany przez kilka problemów. Jedną z potencjalnych przyczyn jest konflikt między zależnościami zdefiniowanymi przez klienta i wbudowanymi modułami języka Python podczas uruchamiania funkcji w planie usługi App Service. Aby uzyskać więcej informacji, zobacz Zarządzanie pakietami.


Rozwiązywanie problemów: nie można załadować pliku lub zestawu

Ten błąd można zobaczyć podczas uruchamiania lokalnego przy użyciu modelu programowania w wersji 2. Ten błąd jest spowodowany znanym problemem, który można rozwiązać w nadchodzącej wersji.

Jest to przykładowy komunikat dla tego błędu:

DurableTask.Netherite.AzureFunctions: Nie można załadować pliku lub zestawu "Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289".
W systemie nie można odnaleźć określonego pliku.

Błąd występuje z powodu problemu ze sposobem buforowania pakietu rozszerzeń. Aby rozwiązać ten problem, uruchom to polecenie za pomocą --verbose polecenia , aby wyświetlić więcej szczegółów:

func host start --verbose

Prawdopodobnie widzisz ten problem z buforowaniem, gdy zobaczysz dziennik ładowania rozszerzenia, tak jak Loading startup extension <> to nie jest obserwowane przez Loaded extension <>program .

Aby rozwiązać ten problem:

  1. Znajdź ścieżkę .azure-functions-core-tools , uruchamiając polecenie:

    func GetExtensionBundlePath
    
  2. .azure-functions-core-tools Usuń katalog.

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

Katalog pamięci podręcznej zostanie ponownie utworzony po ponownym uruchomieniu narzędzi Core Tools.

Rozwiązywanie problemów: nie można rozpoznać połączenia usługi Azure Storage

Ten błąd może zostać wyświetlony w danych wyjściowych lokalnych jako następujący komunikat:

Microsoft.Azure.WebJobs.Extensions.DurableTask: Nie można rozpoznać połączenia usługi Azure Storage o nazwie "Storage".
wartość nie może być równa null. (Parametr "provider")

Ten błąd jest wynikiem sposobu, w jaki rozszerzenia są ładowane z pakietu lokalnie. Aby rozwiązać ten błąd, wykonaj jedną z następujących czynności:

  • Użyj emulatora magazynu, takiego jak Azurite. Ta opcja jest dobrym rozwiązaniem, jeśli nie planujesz używania konta magazynu w aplikacji funkcji.

  • Utwórz konto magazynu i dodaj parametry połączenia do AzureWebJobsStorage zmiennej środowiskowej w pliku localsettings.json. Użyj tej opcji, gdy używasz wyzwalacza lub powiązania konta magazynu z aplikacją lub jeśli masz istniejące konto magazynu. Aby rozpocząć, zobacz artykuł Tworzenie konta magazynu.

Nie można odnaleźć funkcji po wdrożeniu

Istnieje kilka typowych problemów z kompilacją, które mogą spowodować, że funkcje języka Python nie zostaną znalezione przez hosta po najwyraźniej pomyślnym wdrożeniu:

  • Pula agentów musi być uruchomiona w systemie Ubuntu, aby zagwarantować, że pakiety zostaną prawidłowo przywrócone z kroku kompilacji. Upewnij się, że szablon wdrożenia wymaga środowiska Ubuntu do kompilowania i wdrażania.

  • Gdy aplikacja funkcji nie znajduje się w katalogu głównym repozytorium źródłowego, upewnij się, że pip install krok odwołuje się do właściwej lokalizacji, w której ma zostać utworzony .python-packages folder. Należy pamiętać, że w tej lokalizacji jest uwzględniana wielkość liter, na przykład w tym przykładzie polecenia:

    pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
    
  • Szablon musi wygenerować pakiet wdrożeniowy, który można załadować do /home/site/wwwrootprogramu . W usłudze Azure Pipelines jest to wykonywane przez ArchiveFiles zadanie.

Problemy z programowaniem w witrynie Azure Portal

W przypadku korzystania z witryny Azure Portal weź pod uwagę te znane problemy i ich obejścia:

  • Aby usunąć funkcję z aplikacji funkcji w portalu, usuń kod funkcji z samego pliku. Przycisk Usuń nie działa, aby usunąć funkcję podczas korzystania z modelu programowania w języku Python w wersji 2.
  • Podczas tworzenia funkcji w portalu można upomniać użycie innego narzędzia do programowania. Istnieje kilka scenariuszy, w których nie można edytować kodu w portalu, w tym w przypadku wykrycia błędu składniowego. W tych scenariuszach użyj programu Visual Studio Code lub narzędzi Azure Functions Core Tools do tworzenia i publikowania kodu funkcji.

Następne kroki

Jeśli nie możesz rozwiązać problemu, skontaktuj się z zespołem usługi Azure Functions: