Řešení chyb Pythonu ve službě Azure Functions

Tento článek obsahuje informace, které vám pomůžou řešit chyby s funkcemi Pythonu ve službě Azure Functions. Tento článek podporuje programovací modely v1 i v2. V horní části článku vyberte model, který chcete použít.

Poznámka:

Programovací model Pythonu v2 je podporován pouze v modulu runtime funkcí 4.x. Další informace najdete v přehledu verzí modulu runtime Azure Functions.

Tady jsou části řešení běžných problémů s funkcemi Pythonu:

Řešení potíží: ModuleNotFoundError

Tato část vám pomůže vyřešit chyby související s modulem v aplikaci funkcí Pythonu. Tyto chyby obvykle vedou k následující chybové zprávě služby Azure Functions:

Výjimka: ModuleNotFoundError: Žádný modul s názvem "module_name".

K této chybě dochází v případě, že se aplikaci funkcí Pythonu nepodaří načíst modul Pythonu. Hlavní příčinou této chyby je jeden z následujících problémů:

Zobrazení souborů projektu

Pokud chcete zjistit skutečnou příčinu vašeho problému, potřebujete získat soubory projektu Pythonu, které běží ve vaší aplikaci funkcí. Pokud nemáte soubory projektu na místním počítači, můžete je získat jedním z následujících způsobů:

  • Pokud má WEBSITE_RUN_FROM_PACKAGE aplikace funkcí nastavení aplikace a její hodnota je adresa URL, stáhněte si soubor zkopírováním a vložením adresy URL do prohlížeče.
  • Pokud je aplikace funkcí nastavená WEBSITE_RUN_FROM_PACKAGE na 1, přejděte na https://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages soubor a stáhněte ho z nejnovější href adresy URL.
  • Pokud aplikace funkcí nemá některé z předchozích nastavení aplikace, přejděte na https://<app-name>.scm.azurewebsites.net/api/settings adresu URL a najděte ji v části SCM_RUN_FROM_PACKAGE. Stáhněte si soubor zkopírováním a vložením adresy URL do prohlížeče.
  • Pokud návrhy problém vyřeší, přejděte na https://<app-name>.scm.azurewebsites.net/DebugConsole obsah v části /home/site/wwwroot.

Zbývající část tohoto článku vám pomůže vyřešit potenciální příčiny této chyby kontrolou obsahu aplikace funkcí, identifikací původní příčiny a řešením konkrétního problému.

Diagnostika ModuleNotFoundError

Tato část podrobně popisuje potenciální původní příčiny chyb souvisejících s modulem. Jakmile zjistíte, která je pravděpodobnou hlavní příčinou, můžete přejít na související zmírnění rizik.

Balíček nebyl nalezen.

Přejděte na .python_packages/lib/python3.6/site-packages/<package-name> nebo .python_packages/lib/site-packages/<package-name>. Pokud cesta k souboru neexistuje, pravděpodobně příčinou této chybějící cesty je.

Tento problém může způsobit použití nástrojů třetích stran nebo zastaralých nástrojů během nasazování.

Pokud chcete tento problém zmírnit, přečtěte si téma Povolení vzdálených závislostí sestavení nebo sestavení nativních závislostí.

Balíček se nevyřešil správným linuxovým kolečkem.

Přejděte na .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info nebo .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Pomocí oblíbeného textového editoru otevřete soubor kolečka a zkontrolujte oddíl Značka: Problémem může být, že hodnota značky neobsahuje Linux.

Funkce Pythonu běží jenom v Linuxu v Azure. Modul runtime služby Functions v2.x běží na Debian Stretch a modul runtime v3.x běží na Debian Busteru. Očekává se, že artefakt bude obsahovat správné binární soubory Linuxu. Pokud použijete --build local příznak v nástrojích Core Tools, třetích stranách nebo zastaralých nástrojích, může to způsobit použití starších binárních souborů.

Pokud chcete tento problém zmírnit, přečtěte si téma Povolení vzdálených závislostí sestavení nebo sestavení nativních závislostí.

Balíček není kompatibilní s verzí interpretu Pythonu.

Přejděte na .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info nebo .python_packages/lib/site-packages/<package-name>-<version>-dist-info. V textovém editoru otevřete soubor METADATA a zkontrolujte oddíl Klasifikátory: Pokud oddíl neobsahuje Python :: 3, , Python :: 3.6, Python :: 3.7Python :: 3.8nebo Python :: 3.9, verze balíčku je buď příliš stará, nebo je pravděpodobnější, že už není údržba.

Verzi Pythonu vaší aplikace funkcí můžete zkontrolovat na webu Azure Portal. Přejděte na stránku prostředku Přehled vaší aplikace funkcí a vyhledejte verzi modulu runtime. Verze modulu runtime podporuje verze Pythonu, jak je popsáno v přehledu verzí modulu runtime Azure Functions.

Pokud chcete tento problém zmírnit, přečtěte si téma Aktualizace balíčku na nejnovější verzi nebo nahrazení balíčku ekvivalenty.

Balíček je v konfliktu s jinými balíčky.

Pokud jste ověřili, že se balíček správně vyřešil se správnými linuxovými koly, může dojít ke konfliktu s jinými balíčky. V některých balíčcích může dokumentace PyPi objasnit nekompatibilní moduly. Například v azure 4.0.0příkazu najdete následující příkaz:

Tento balíček není kompatibilní s azure-storage. Pokud jste nainstalovali azure-storage nebo jste nainstalovali Azure 1.x/2.x a neodinstalovali azure-storage, musíte nejprve odinstalovat azure-storage.

Dokumentaci k verzi balíčku najdete v https://pypi.org/project/<package-name>/<package-version>souboru .

Pokud chcete tento problém zmírnit, přečtěte si téma Aktualizace balíčku na nejnovější verzi nebo nahrazení balíčku ekvivalenty.

Balíček podporuje pouze platformy Windows a macOS.

Otevřete textový requirements.txt editor a zkontrolujte balíček v https://pypi.org/project/<package-name>souboru . Některé balíčky běží jenom na platformách Windows a macOS. Například pywin32 běží jenom ve Windows.

K Module Not Found chybě nemusí dojít, když používáte Windows nebo macOS pro místní vývoj. Balíček se ale nepodaří importovat do služby Azure Functions, která používá Linux za běhu. Příčinou tohoto problému je pravděpodobně použití pip freeze k exportu virtuálního prostředí do requirements.txt z počítače s Windows nebo macOS během inicializace projektu.

Pokud chcete tento problém zmírnit, přečtěte si téma Nahrazení balíčku ekvivalenty nebo requirements.txt rukodělné práce.

Zmírnění chyby ModuleNotFoundError

Níže jsou uvedené potenciální zmírnění problémů souvisejících s modulem. Pomocí výše uvedených diagnostik můžete určit, která z těchto omezení rizik se má vyzkoušet.

Povolení vzdáleného sestavení

Ujistěte se, že je povolené vzdálené sestavení. Způsob, jakým se ujistíte, závisí na vaší metodě nasazení.

Ujistěte se, že je nainstalovaná nejnovější verze rozšíření Azure Functions pro Visual Studio Code . Ověřte, že soubor .vscode/settings.json existuje a obsahuje nastavení "azureFunctions.scmDoBuildDuringDeployment": true. Pokud ne, vytvořte soubor s povoleným azureFunctions.scmDoBuildDuringDeployment nastavením a znovu nasaďte projekt.

Vytváření nativních závislostí

Ujistěte se, že jsou nainstalované nejnovější verze Dockeru i nástrojů Azure Functions Core Tools . Přejděte do složky projektu místní funkce a použijte func azure functionapp publish <app-name> --build-native-deps ji k nasazení.

Aktualizace balíčku na nejnovější verzi

V nejnovější verzi https://pypi.org/project/<package-name>balíčku zkontrolujte oddíl Klasifikátory: Balíček by měl být OS Independentnebo kompatibilní s POSIX operačním systémem nebo POSIX :: Linux v operačním systému. Programovací jazyk by také měl obsahovat: Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8, nebo Python :: 3.9.

Pokud jsou tyto položky balíčku správné, můžete balíček aktualizovat na nejnovější verzi změnou řádku <package-name>~=<latest-version> v requirements.txt.

Requirements.txt rukou

Někteří vývojáři používají pip freeze > requirements.txt k vygenerování seznamu balíčků Pythonu pro vývojová prostředí. I když by tato pohodlí měla ve většině případů fungovat, můžou se zde vyskytovat problémy ve scénářích nasazení mezi platformami, jako je místní vývoj funkcí ve Windows nebo macOS, ale publikování do aplikace funkcí, která běží v Linuxu. V tomto scénáři pip freeze můžete zavést neočekávané závislosti nebo závislosti specifické pro operační systém pro vaše místní vývojové prostředí. Tyto závislosti můžou aplikaci funkcí Pythonu přerušit, když běží v Linuxu.

Osvědčeným postupem je zkontrolovat příkaz importu z každého souboru .py ve zdrojovém kódu projektu a pak vrátit se změnami pouze moduly v souboru requirements.txt . Tento postup zaručuje, že řešení balíčků je možné správně zpracovat v různých operačních systémech.

Nahrazení balíčku ekvivalenty

Nejprve se podívejte na nejnovější verzi balíčku v https://pypi.org/project/<package-name>souboru . Tento balíček má obvykle vlastní stránku GitHubu. Přejděte do části Problémy na GitHubu a vyhledejte, jestli se váš problém vyřešil. Pokud byla opravena, aktualizujte balíček na nejnovější verzi.

Někdy se balíček mohl integrovat do standardní knihovny Pythonu (například pathlib). Pokud ano, protože poskytujeme určitou distribuci Pythonu ve službě Azure Functions (Python 3.6, Python 3.7, Python 3.8 a Python 3.9), měl by se balíček ve vašem souboru requirements.txt odebrat.

Pokud ale zjistíte, že problém nebyl opravený a že jste ve lhůtě, doporučujeme, abyste provedli průzkum, abyste našli podobný balíček pro váš projekt. Komunita Pythonu vám obvykle poskytuje širokou škálu podobných knihoven, které můžete použít.

Zakázání příznaku izolace závislostí

Nastavte nastavení aplikace PYTHON_ISOLATE_WORKER_DEPENDENCIES na hodnotu 0.


Řešení potíží: Nejde importovat cygrpc

Tato část vám pomůže vyřešit chyby související s cygrpc v aplikaci funkcí Pythonu. Tyto chyby obvykle vedou k následující chybové zprávě služby Azure Functions:

Nelze importovat název cygrpc z grpc._cython

K této chybě dochází v případě, že se aplikaci funkcí Pythonu nepodaří spustit se správným interpretem Pythonu. Hlavní příčinou této chyby je jeden z následujících problémů:

Diagnostika chyby odkazu cygrpc

Existuje několik možnýchpříčinch cygrpc

Interpret Pythonu neshoduje architekturu operačního systému.

Příčinou této neshody je pravděpodobně 32bitový interpret Pythonu nainstalovaný ve vašem 64bitovém operačním systému.

Pokud používáte operační systém x64, ujistěte se, že je váš interpret Python verze 3.6, 3.7, 3.8 nebo 3.9 také na 64bitové verzi.

Bitovou verzi interpreta Pythonu můžete zkontrolovat spuštěním následujících příkazů:

Ve Windows v PowerShellu spusťte py -c 'import platform; print(platform.architecture()[0])'příkaz .

V prostředí podobném unixu spusťte python3 -c 'import platform; print(platform.architecture()[0])'příkaz .

Pokud došlo k neshodě mezi bitovou verzí interpreta Pythonu a architekturou operačního systému, stáhněte si správný interpret Pythonu ze služby Python Software Foundation.

Pracovní proces Pythonu ve službě Azure Functions nepodporuje interpret Pythonu.

Pracovní proces Pythonu služby Azure Functions podporuje pouze konkrétní verze Pythonu.

Zkontrolujte, jestli interpret Pythonu odpovídá očekávané verzi py --version ve Windows nebo python3 --version v systémech Unix. Ujistěte se, že vrácený výsledek je jednou z podporovaných verzí Pythonu.

Pokud vaše verze interpreta Pythonu nesplňuje požadavky pro Azure Functions, stáhněte si místo toho verzi interpretu Pythonu podporovanou funkcí ze služby Python Software Foundation.


Řešení potíží: Python se ukončil s kódem 137

Chyby kódu 137 jsou obvykle způsobeny problémy s nedostatkem paměti v aplikaci funkcí Pythonu. V důsledku toho se zobrazí následující chybová zpráva Azure Functions:

Microsoft.Azure.WebJobs.Script.WorkerProcessExitException: Python se ukončil s kódem 137

K této chybě dochází, když je aplikace funkcí Pythonu nucena ukončit operačním systémem signálem SIGKILL . Tento signál obvykle značí chybu nedostatku paměti v procesu Pythonu. Platforma Azure Functions má omezení služby, které ukončí všechny aplikace funkcí, které tento limit překročí.

Pokud chcete analyzovat kritické body paměti v aplikaci funkcí, přečtěte si téma Profil aplikace funkcí Pythonu v místním vývojovém prostředí.


Řešení potíží: Python se ukončil s kódem 139

Tato část vám pomůže vyřešit chyby chyb segmentace v aplikaci funkcí Pythonu. Tyto chyby obvykle vedou k následující chybové zprávě služby Azure Functions:

Microsoft.Azure.WebJobs.Script.WorkerProcessExitException: Python se ukončil s kódem 139

K této chybě dochází, když je aplikace funkcí Pythonu nucena ukončit operačním systémem signálem SIGSEGV . Tento signál označuje porušení segmentace paměti, což může mít za následek neočekávané čtení z oblasti omezené paměti nebo zápis do oblasti omezené paměti. V následujících částech uvádíme seznam běžných původních příčin.

Regrese z balíčků třetích stran

V souboru requirements.txt vaší aplikace funkcí se během každého nasazení do Azure upgraduje na nejnovější verzi. Aktualizace balíčků můžou potenciálně představovat regrese, které ovlivňují vaši aplikaci. Pokud se chcete z těchto problémů zotavit, zakomentujte příkazy importu, zakažte odkazy na balíčky nebo připněte balíček na předchozí verzi v requirements.txt.

Zrušení odobření z poškozeného souboru .pkl

Pokud vaše aplikace funkcí k načtení objektu Pythonu ze souboru .pkl používá knihovnu pickle Pythonu, je možné, že soubor obsahuje poškozený řetězec bajtů nebo neplatný odkaz na adresu. Pokud se chcete z tohoto problému zotavit, zkuste funkci okomentovat pickle.load() .

Kolize připojení Pyodbc

Pokud vaše aplikace funkcí používá oblíbený ovladač databáze ODBC pyodbc, je možné, že v jedné aplikaci funkcí je otevřeno více připojení. Pokud se chcete tomuto problému vyhnout, použijte jeden vzor a ujistěte se, že se v aplikaci funkcí používá jenom jedno připojení pyodbc.


Triggery synchronizace selhaly.

Příčinou chyby Sync triggers failed může být několik problémů. Jednou z možných příčin je konflikt mezi závislostmi definovanými zákazníkem a integrovanými moduly Pythonu při spuštění funkcí v plánu služby App Service. Další informace najdete v tématu Správa balíčků.


Řešení potíží: Nepodařilo se načíst soubor nebo sestavení

Tato chyba se zobrazí při místním spuštění pomocí programovacího modelu v2. Příčinou této chyby je známý problém, který se má vyřešit v nadcházející verzi.

Toto je příklad zprávy pro tuto chybu:

DurableTask.Netherite.AzureFunctions: Nelze načíst soubor nebo sestavení Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289'.
Systém nemůže najít zadaný soubor.

K chybě dochází kvůli problému s ukládáním sady rozšíření do mezipaměti. Pokud chcete tento problém vyřešit, spusťte tento příkaz --verbose a zobrazte další podrobnosti:

func host start --verbose

Pravděpodobně dochází k tomuto problému s ukládáním do mezipaměti, když uvidíte protokol načítání rozšíření, jako Loading startup extension <> je ten, za kterým nenásleduje Loaded extension <>.

Řešení tohoto problému:

  1. .azure-functions-core-tools Najděte cestu spuštěním příkazu:

    func GetExtensionBundlePath
    
  2. .azure-functions-core-tools Odstraňte adresář.

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

Adresář mezipaměti se znovu vytvoří při opětovném spuštění nástrojů Core Tools.

Řešení potíží: Nejde vyřešit připojení ke službě Azure Storage

Tato chyba se může zobrazit v místním výstupu jako následující zpráva:

Microsoft.Azure.WebJobs.Extensions.DurableTask: Nejde přeložit připojení služby Azure Storage s názvem Storage.
Hodnota nemůže být rovná null. (Parametr 'provider')

Tato chyba je výsledkem toho, jak se rozšíření načítají z sady místně. Pokud chcete tuto chybu vyřešit, proveďte jednu z následujících akcí:

  • Použijte emulátor úložiště, jako je Azurite. Tato možnost je vhodná, když ve své aplikaci funkcí neplánujete používat účet úložiště.

  • Vytvořte účet úložiště a do proměnné prostředí v AzureWebJobsStoragesouboru localsettings.json přidejte připojovací řetězec. Tuto možnost použijte, pokud používáte trigger nebo vazbu účtu úložiště s aplikací nebo pokud máte existující účet úložiště. Než začnete, přečtěte si článek Vytvoření účtu úložiště.

Funkce se po nasazení nenašly.

Existuje několik běžných problémů s sestavením, které můžou způsobit, že hostitel po zdánlivě úspěšném nasazení nenajde funkce Pythonu:

  • Fond agentů musí být spuštěný na Ubuntu, aby se zajistilo, že se balíčky z kroku sestavení správně obnoví. Ujistěte se, že vaše šablona nasazení vyžaduje prostředí Ubuntu pro sestavení a nasazení.

  • Pokud aplikace funkcí není v kořenovém adresáři zdrojového úložiště, ujistěte se, že pip install krok odkazuje na správné umístění, ve kterém se má složka vytvořit .python-packages . Mějte na paměti, že v tomto umístění se rozlišují malá a velká písmena, například v tomto příkladu příkazu:

    pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
    
  • Šablona musí vygenerovat balíček nasazení, do kterého lze načíst /home/site/wwwroot. V Azure Pipelines to provádí úloha ArchiveFiles .

Problémy s vývojem na webu Azure Portal

Při používání webu Azure Portal vezměte v úvahu tyto známé problémy a jejich alternativní řešení:

  • Pokud chcete odstranit funkci z aplikace funkcí na portálu, odeberte kód funkce ze samotného souboru. Při použití programovacího modelu Pythonu v2 nefunguje tlačítko Odstranit funkci.
  • Při vytváření funkce na portálu můžete být vyzváni k použití jiného nástroje pro vývoj. Existuje několik scénářů, kdy nemůžete upravit kód na portálu, včetně toho, kdy byla zjištěna chyba syntaxe. V těchto scénářích můžete pomocí nástroje Visual Studio Code nebo Azure Functions Core Tools vyvíjet a publikovat kód funkce.

Další kroky

Pokud se vám nedaří problém vyřešit, obraťte se na tým Azure Functions: