Résoudre des erreurs Python dans Azure Functions

Cet article fournit des informations pour vous aider à résoudre les erreurs liées à vos fonctions Python dans Azure Functions. Cet article prend en charge les modèles de programmation v1 et v2. Choisissez le modèle que vous souhaitez utiliser dans le sélecteur en haut de l’article.

Remarque

Le modèle de programmation Python v2 est uniquement pris en charge dans le runtime de fonctions 4.x. Pour plus d’informations, consultez Vue d’ensemble des versions du runtime Azure Functions.

Voici les sections de résolution des problèmes courants dans les fonctions Python :

Résolution de problème : ModuleNotFoundError

Cette section vous aide à résoudre des erreurs liées à un module dans votre application de fonction Python. Ces erreurs entraînent généralement le message d’erreur Azure Functions suivant :

Exception : ModuleNotFoundError : aucun module nommé 'module_name'.

Cette erreur se produit quand une application de fonction Python ne parvient pas à charger un module Python. La cause racine de cette erreur est l’un des problèmes suivants :

Afficher les fichiers projet

Pour identifier la cause réelle de votre problème, vous devez récupérer les fichiers projet Python qui s’exécutent sur votre application de fonction. Si ces fichiers projet ne sont pas disponibles sur votre ordinateur local, vous pouvez les obtenir de l’une des manières suivantes :

  • Si l’application de fonction a un paramètre d’application WEBSITE_RUN_FROM_PACKAGE et que sa valeur est une URL, téléchargez le fichier en copiant l’URL et en la collant dans votre navigateur.
  • Si l’application de fonction a un paramètre d’application WEBSITE_RUN_FROM_PACKAGE ayant la valeur 1, accédez à https://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages et téléchargez le fichier à partir de la dernière URL href.
  • Si l’application de la fonction n’a pas l’un ou l’autre des paramètres d’application précédents, allez sur https://<app-name>.scm.azurewebsites.net/api/settingset trouvez l’URL sous SCM_RUN_FROM_PACKAGE. Téléchargez le fichier en copiant l’URL et en la collant dans votre navigateur.
  • Si les suggestions résolvent le problème, accédez à https://<app-name>.scm.azurewebsites.net/DebugConsole et affichez le contenu se trouvant sous /home/site/wwwroot.

Le reste de cet article détaille la procédure à suivre pour résoudre les causes potentielles de cette erreur : inspection du contenu de votre application de fonction, identification de la cause racine et résolution du problème spécifique.

Diagnostiquer ModuleNotFoundError

Cette section détaille les causes racines potentielles des erreurs liées à un module. Une fois que vous aurez déterminé la cause racine probable, vous pourrez accéder aux solutions d’atténuation associées.

Le package est introuvable

Accédez à .python_packages/lib/python3.6/site-packages/<package-name> ou à .python_packages/lib/site-packages/<package-name>. Si le chemin au fichier n’existe pas, ce chemin manquant est probablement la cause racine.

L’utilisation d’outils tiers ou obsolètes durant le déploiement peut occasionner ce problème.

Pour atténuer ce problème, consultez Activer la génération à distance ou Générer des dépendances natives.

Le package n’est pas résolu avec le fichier wheel Linux approprié

Accédez à .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info ou à .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Utilisez votre éditeur de texte préféré pour ouvrir le fichier wheel et consultez la section Tag: . Le problème peut être que la valeur de balise ne contient pas linux.

Les fonctions Python s’exécutent uniquement sur Linux dans Azure. Le runtime Functions v2.x s’exécute sur Debian Stretch et le runtime v3.x s’exécute sur Debian Buster. L’artefact doit contenir les binaires Linux appropriés. Lors de l’utilisation de l’indicateur --build local dans Core Tools, d’outils tiers ou d’outils obsolètes peut entraîner l’utilisation de binaires plus anciens.

Pour atténuer ce problème, consultez Activer la génération à distance ou Générer des dépendances natives.

Le package n’est pas compatible avec la version de l’interpréteur Python

Accédez à .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info ou à .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Dans votre éditeur de texte, ouvrez le fichier METADATA et examinez la section Classifiers:. Si la section ne contient pas Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8, ou Python :: 3.9, cela signifie que la version du package est trop ancienne ou, plus vraisemblablement, que c’est déjà hors de maintenance.

Vous pouvez vérifier la version de Python de votre application de fonction à partir du portail Azure. Accédez à la page de ressources Vue d’ensemble de votre application de fonction pour rechercher la version du runtime. La version du runtime prend en charge les versions de Python, comme décrit dans la vue d’ensemble des versions du runtime Azure Functions.

Pour atténuer le problème, consultez Mettre à jour votre package vers la dernière version ou Remplacer le package par des équivalents.

Le package est en conflit avec d’autres packages

Si vous avez vérifié que le package est correctement résolu avec les fichiers wheel Linux appropriés, il peut y avoir un conflit avec d’autres packages. Dans certains packages, la documentation PyPi peut clarifier les modules incompatibles. Par exemple, dans azure 4.0.0, vous trouverez l’instruction suivante :

This package isn't compatible with azure-storage. If you installed azure-storage, or if you installed azure 1.x/2.x and didn’t uninstall azure-storage, you must uninstall azure-storage first.

Vous trouverez la documentation de votre version de package dans https://pypi.org/project/<package-name>/<package-version>.

Pour atténuer le problème, consultez Mettre à jour votre package vers la dernière version ou Remplacer le package par des équivalents.

Le package ne prend en charge que les plateformes Windows ou macOS

Ouvrez requirements.txt dans un éditeur de texte et vérifiez le package dans https://pypi.org/project/<package-name>. Certains packages s’exécutent uniquement sur des plateformes Windows et macOS. Par exemple, pywin32 s’exécute uniquement sur Windows.

L’erreur Module Not Found peut ne pas se produire quand vous utilisez Windows ou macOS pour le développement local. Toutefois, le package n’est pas importé dans Azure Functions qui utilise Linux au moment de l’exécution. Le problème est probablement dû à l’utilisation de pip freeze pour exporter un environnement virtuel dans requirements.txt à partir de votre ordinateur Windows ou macOS durant l’initialisation du projet.

Pour atténuer le problème, consultez Remplacer le package par des équivalents ou Handcraft requirements.txt.

Atténuer ModuleNotFoundError

Voici des mesures d’atténuation potentielles pour les problèmes liés à un module. Utilisez les diagnostics mentionnés précédemment pour déterminer les mesures d’atténuation à essayer.

Activer la build distante

Vérifiez que la build distante est activée. La façon de vous en assurer dépend de votre méthode de déploiement.

Vérifiez que la dernière version de l’extension Azure Functions pour Visual Studio Code est installée. Vérifiez que le fichier .vscode/settings.json existe et qu’il contient le paramètre "azureFunctions.scmDoBuildDuringDeployment": true. Si ce n’est pas le cas, créez le fichier avec le paramètre azureFunctions.scmDoBuildDuringDeployment activé, puis redéployez le projet.

Générer des dépendances natives

Vérifiez que les dernières versions des deux dockers et d’Azure Functions Core Tools sont installées. Accédez au dossier de votre projet de fonction local et utilisez func azure functionapp publish <app-name> --build-native-deps pour le déploiement.

Mettre à jour votre package avec la dernière version

Accédez à la dernière version du package dans https://pypi.org/project/<package-name> et examinez la section Classifieurs :. Le package doit être OS Independent ou compatible avec POSIX ou POSIX :: Linux dans Système d’exploitation. En outre, le langage de programmation doit contenir Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8 ou Python :: 3.9.

Si ces éléments de package sont corrects, vous pouvez mettre à jour le package avec la dernière version en modifiant la ligne <package-name>~=<latest-version> dans requirements.txt.

Fabriquer vous-même requirements.txt

Certains développeurs utilisent pip freeze > requirements.txt pour générer la liste des packages Python pour leurs environnements de développement. Bien que cette pratique fonctionne le plus souvent, des problèmes peuvent se présenter dans les scénarios de déploiement multiplateforme. C’est notamment le cas si vous développez des fonctions localement sur Windows ou macOS, mais que vous les publiez sur une application de fonction qui s’exécute sur Linux. Dans un tel scénario, pip freeze peut introduire des dépendances inattendues spécifiques au système d’exploitation ou des dépendances pour votre environnement de développement local. Ces dépendances peuvent provoquer l’arrêt de l’application de fonction Python en cas d’exécution sur Linux.

La meilleure pratique consiste à vérifier l’instruction d’importation de chaque fichier .py dans le code source de votre projet, puis à n’intégrer que les modules figurant dans le fichier requirements.txt. Cette pratique garantie que la résolution des packages est correctement gérée sur différents systèmes d’exploitation.

Remplacer le package par des équivalents

D’abord, examinons si nous disposons de la version la plus récente du package dans https://pypi.org/project/<package-name>. Ce package a généralement sa propre page GitHub. Accédez à la section Problèmes sur GitHub et recherchez si votre problème a été résolu. S’il a été résolu, mettez à jour le package vers la dernière version.

Parfois, le package peut être intégré à la bibliothèque Python Standard Library (par exemple, pathlib). Dans ce cas, étant donné que nous fournissons une certaine distribution Python dans Azure Functions (Python 3.6, Python 3.7, Python 3.8 et Python 3.9), le package dans votre fichier requirements.txt doit être supprimé.

Toutefois, si vous constatez que le problème n’a pas été résolu et que vous respectez une date limite, nous vous encourageons à effectuer des recherches pour trouver un package similaire pour votre projet. En général, la communauté Python met à votre disposition une grande variété de bibliothèques similaires.

Désactiver l’indicateur d’isolation des dépendances

Définissez le paramètre d’application PYTHON_ISOLATE_WORKER_DEPENDENCIES sur une valeur de 0.


Résolution de problème : Impossible d’importer 'cygrpc'

Cet article vous aide à résoudre les erreurs liées à « cygrpc » dans votre application de fonction Python. Ces erreurs entraînent généralement le message d’erreur Azure Functions suivant :

Impossible d’importer le nom 'cygrpc' à partir de 'grpc._cython'

Cette erreur se produit quand une application de fonction Python ne parvient pas à démarrer avec un interpréteur Python approprié. La cause racine de cette erreur est l’un des problèmes suivants :

Diagnostiquer l’erreur de référence « cygrpc »

Il existe plusieurs causes possibles pour les erreurs qui référencent cygrpc ; elles sont détaillées dans cette section.

L’interpréteur Python est mal incompatible l’architecture du système d’exploitation

Ce décalage est très probablement dû à l’installation d’un interpréteur Python 32 bits sur votre système d’exploitation 64 bits.

Si vous travaillez sur un système d’exploitation x64, assurez-vous que votre interpréteur Python version 3.6, 3.7, 3.8 ou 3.9 est également sur une version 64 bits.

Vous pouvez vérifier le nombre de bits de votre interpréteur Python en exécutant les commandes suivantes :

Sur Windows dans PowerShell, exécutez py -c 'import platform; print(platform.architecture()[0])'.

Sur un interpréteur de commandes de type Unix, exécutez python3 -c 'import platform; print(platform.architecture()[0])'.

En cas d’incompatibilité entre le nombre de bits de l’interpréteur Python et l’architecture du système d’exploitation, téléchargez un interpréteur python approprié à partir de Python Software Foundation.

L’interpréteur Python n’est pas pris en charge par le Worker Python Azure Functions

Le Worker Python Azure Functions prend uniquement en charge des versions spécifiques de Python.

Vérifiez si votre interpréteur Python correspond à notre version attendue en utilisant py --version sous Windows ou python3 --version dans des systèmes de type Unix. Vérifiez que le résultat de retour est l’une des versions de Python prises en charge.

Si votre version de l’interpréteur Python ne répond pas aux exigences pour Azure Functions, téléchargez une version de l’interpréteur Python prise en charge par Functions à partir de Python Software Foundation.


Résolution de problème : Python s’est arrêté avec le code 137

Les erreurs de code 137 sont généralement dues à des problèmes de mémoire insuffisante dans votre application de fonction Python. Par conséquent, vous obtenez le message d’erreur Azure Functions suivant :

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : Python s’est arrêté avec le code 137

Cette erreur se produit lorsqu’une application de fonction Python est forcée de s’arrêter par le système d’exploitation avec un signal SIGKILL. Ce signal indique généralement une erreur de mémoire insuffisante dans votre processus Python. La plateforme Azure Functions a une limite de service qui met fin à toute application de fonction qui dépasse cette limite.

Pour analyser le goulot d’étranglement de la mémoire dans votre application de fonction, consultez Profiler une application de fonction Python dans un environnement de développement local.


Résolution de problème : Python s’est arrêté avec le code 139

Cette section vous aide à résoudre les erreurs de segmentation dans votre application de fonction Python. Ces erreurs entraînent généralement le message d’erreur Azure Functions suivant :

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : Python s’est arrêté avec le code 139

Cette erreur se produit lorsqu’une application de fonction Python est forcée de s’arrêter par le système d’exploitation avec un signal SIGSEGV. Ce signal indique une violation de la segmentation de la mémoire, qui peut résulter d’une lecture ou d’une écriture inattendue à partir d’une région de mémoire restreinte. Dans les sections suivantes, nous fournissons une liste des causes racine courantes.

Régression à partir de paquets tiers

Dans le fichier requirements.txt de votre application de fonction, un package non épinglé est mis à niveau vers la version la plus récente durant chaque déploiement sur Azure. Les mises à jour de package peuvent potentiellement introduire des régressions qui affectent votre application. Pour résoudre ce type de problème, commentez les instructions d’importation, désactivez les références du package ou épinglez le package à une version antérieure dans requirements.txt.

Décrochage d’un fichier .pkl malformé

Si votre application de fonction utilise la bibliothèque Python pickle pour charger des objets Python à partir d’un fichier .pkl, il est possible que ce fichier contienne une chaîne d’octets malformée ou une référence d’adresse non valide. Pour résoudre ce problème, essayez de commenter la fonction pickle.load().

Collision de connexion Pyodbc

Si votre application de fonction utilise le pilote de base de données ODBC pyodbc, il est possible que plusieurs connexions soient ouvertes dans une même application de fonction. Pour éviter ce problème, utilisez le modèle singleton et assurez-vous qu’une seule connexion pyodbc est utilisée dans l’application de fonction.


Déclenchements de synchronisation ayant échoué

L’erreur Sync triggers failed peut être due à plusieurs problèmes. Une cause potentielle est un conflit entre les dépendances définies par le client et les modules intégrés Python lorsque vos fonctions s’exécutent dans un plan App Service. Pour plus d’informations, consultez Gestion de packages.


Résolution de problème : Échec du chargement d’un fichier ou d’un assembly

Vous pouvez voir cette erreur lorsque vous exécutez localement à l’aide du modèle de programmation v2. Il s’agit d’un problème connu qui sera résolu dans une prochaine version.

Voici un exemple de message pour cette erreur :

DurableTask.Netherite.AzureFunctions : Impossible de charger le fichier ou l’assembly 'Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289'.
Le système ne peut pas trouver le fichier spécifié.

L’erreur est due à un problème lié à la façon dont le pack d’extensions a été mis en cache. Pour résoudre le problème, exécutez cette commande avec --verbose pour afficher plus de détails :

func host start --verbose

Il est probable que vous observiez ce problème de mise en cache lorsque vous voyez un journal de chargement d’extension comme Loading startup extension <> qui n’est pas suivi de Loaded extension <>.

Pour résoudre ce problème :

  1. Recherchez le chemin .azure-functions-core-tools en exécutant :

    func GetExtensionBundlePath
    
  2. Supprimer le répertoire .azure-functions-core-tools.

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

Le répertoire du cache est recréé lorsque vous réexécutez Core Tools.

Résolution de problème : Impossible de résoudre la connexion Stockage Azure

Vous pouvez voir cette erreur dans votre sortie locale sous la forme du message suivant :

Microsoft.Azure.WebJobs.Extensions.DurableTask : Impossible de résoudre la connexion Stockage Azure nommée 'Storage'.
Value cannot be null. (Paramètre 'provider')

Cette erreur est due à la façon dont les extensions sont chargées localement à partir du pack. Pour résoudre cette erreur, effectuez l’une des opérations suivantes :

  • Utilisez un émulateur de stockage tel qu’Azurite. Il s’agit d’une bonne option lorsque vous ne prévoyez pas d’utiliser un compte de stockage dans votre application de fonction.

  • Créez un compte de stockage et ajoutez une chaîne de connexion à la variable d’environnement AzureWebJobsStorage dans le fichier localsettings.json. Utilisez cette option lorsque vous utilisez un déclencheur ou une liaison de compte de stockage avec votre application, ou si vous disposez d’un compte de stockage existant. Pour commencer, consultez Créer un compte de stockage.

Fonctions introuvables après le déploiement

Plusieurs problèmes de génération courants peuvent empêcher les fonctions Python d’être trouvées par l’hôte après un déploiement apparemment réussi :

  • Le pool d’agents doit être exécuté sur Ubuntu pour garantir que les paquets sont restaurés correctement à partir de l’étape de génération. Assurez-vous que votre modèle de déploiement nécessite un environnement Ubuntu pour la génération et le déploiement.

  • Lorsque l’application de fonction n’est pas à la racine du référentiel source, vérifiez que l’étape pip install référence l’emplacement approprié dans lequel créer le dossier .python-packages. N’oubliez pas que cet emplacement respecte la casse, par exemple dans cet exemple de commande :

    pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
    
  • Le modèle doit générer un package de déploiement qui peut être chargé dans /home/site/wwwroot. Dans Azure Pipelines, cette opération est effectuée par la tâche ArchiveFiles.

Problèmes de développement dans le portail Azure

Lorsque vous utilisez le portail Azure, prenez en compte ces problèmes connus et leurs solutions de contournement :

  • Pour supprimer une fonction d’une application de fonction dans le portail, supprimez le code de fonction du fichier lui-même. Le bouton Supprimer ne fonctionne pas pour supprimer la fonction en cas d’utilisation du modèle de programmation Python v2.
  • Lors de la création d’une fonction dans le portail, vous pouvez être blâmé pour l’utilisation d’un autre outil pour le développement. Il existe plusieurs scénarios où vous ne pouvez pas modifier votre code dans le portail, notamment lorsqu’une erreur de syntaxe a été détectée. Dans ces scénarios, utilisez Visual Studio Code ou Azure Functions Core Tools pour développer et publier votre code de fonction.

Étapes suivantes

Si vous ne parvenez pas à résoudre votre problème, signalez-le à l’équipe Azure Functions :