Solución de errores de Python en Azure Functions

En este artículo se proporciona información para ayudarle a solucionar errores con las funciones de Python en Azure Functions. En este artículo se admiten los modelos de programación v1 y v2. Elija el modelo que quiere usar en el selector de la parte superior del artículo. El modelo v2 está actualmente en versión preliminar. Para más información sobre los modelos de programación de Python, consulte la guía para desarrolladores de Python.

Estas son las secciones de solución de problemas para problemas comunes en las funciones de Python:

Solución de problemas de ModuleNotFoundError

Esta sección le ayuda a solucionar los errores relacionados con el módulo en su aplicación de funciones de Python. Estos errores suelen generar el siguiente mensaje de error de Azure Functions:

"Excepción: ModuleNotFoundError: no hay ningún módulo denominado 'module_name'."

Este error se produce cuando una aplicación de funciones de Python no puede cargar un módulo de Python. La causa principal de este error es alguno de los siguientes problemas:

Visualización de los archivos del proyecto

Para identificar la causa real del problema, debe obtener los archivos de proyecto de Python que se ejecutan en la aplicación de funciones. Si no tiene los archivos de proyecto en el equipo local, puede obtenerlos de una de las siguientes formas:

  • Si la aplicación de funciones tiene la configuración de aplicación WEBSITE_RUN_FROM_PACKAGE y su valor es una URL, copie y pegue dicha URL en el explorador para descargar el archivo.
  • Si la aplicación de funciones tiene la configuración WEBSITE_RUN_FROM_PACKAGE y está establecida en 1, diríjase a https://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages y descargue el archivo de la dirección URL de href más reciente.
  • Si la aplicación de funciones no tiene ninguna de las configuraciones de la aplicación anterior, diríjase a https://<app-name>.scm.azurewebsites.net/api/settings y busque la dirección URL en SCM_RUN_FROM_PACKAGE. Copie y pegue la URL en el explorador para descargar el archivo.
  • Si ninguna de estas sugerencias resuelve el problema, vaya a https://<app-name>.scm.azurewebsites.net/DebugConsole y vea el contenido en /home/site/wwwroot.

El resto de este artículo le ayudará a solucionar las posibles causas de este error al inspeccionar el contenido de la aplicación de funciones, identificar la causa principal y solucionar el problema específico.

Diagnóstico de ModuleNotFoundError

En esta sección se detallan las posibles causas principales de los errores relacionados con el módulo. Después de averiguar cuál es la causa principal más probable, puede dirigirse a la mitigación de riesgos correspondiente.

No se puede encontrar el paquete

Vaya a .python_packages/lib/python3.6/site-packages/<package-name> o .python_packages/lib/site-packages/<package-name>. Si la ruta de acceso del archivo no existe, es probable que esta ruta faltante sea la causa principal.

Usar herramientas de terceros u obsoletas durante la implementación puede generar este problema.

Para mitigar este problema, consulte Habilitación de la compilación remota o Compilación de dependencias nativas.

El paquete no se ha resuelto con el archivo wheel de Linux adecuado

Vaya a .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info o .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Use su editor de texto preferido para abrir el archivo wheel y compruebe la sección Tag: . El problema puede ser que el valor de etiqueta no contenga Linux.

Las funciones de Python solo se ejecutan en Linux con Azure. El runtime de Functions v2.x se ejecuta en Debian Stretch y la versión v3.x en Debian Buster. Se espera que el artefacto contenga los archivos binarios de Linux correctos. Cuando se usa la marca --build local en Core Tools, en herramientas de terceros o en herramientas obsoletas, puede hacer que se usen binarios más antiguos.

Para mitigar el problema, consulte Habilitación de la compilación remota o Compilación de dependencias nativas.

El paquete no es compatible con la versión del intérprete de Python

Vaya a .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info o .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Con un editor de texto, abra el archivo METADATA y compruebe la sección Classifiers:. Si esta sección no contiene Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8 o Python :: 3.9, la versión del paquete es demasiado antigua o, probablemente, el paquete ya no recibe mantenimiento.

Puede comprobar la versión de Python de la aplicación de funciones en Azure Portal. Vaya a la página de recursos de Información general de la aplicación de funciones para buscar la versión del runtime. La versión del runtime admite versiones de Python como se describe en la Información general de las versiones en tiempo de ejecución de Azure Functions.

Para mitigar el problema, consulte Actualización del paquete a la versión más reciente o Reemplazo del paquete por equivalentes.

El paquete entra en conflicto con otros paquetes

Si ha comprobado que el paquete se resolvió correctamente con los archivos wheel de Linux adecuados, puede haber un conflicto con otros paquetes. En el caso de algunos paquetes, la documentación de PyPi puede clarificar a los módulos incompatibles. Por ejemplo, en azure 4.0.0, encontrará la siguiente instrucción:

"Este paquete no es compatible con azure-storage. Si instaló azure-storage o si instaló Azure 1.x/2.x y no desinstaló azure-storage, primero debe desinstalar azure-storage."

Puede encontrar la documentación para su versión del paquete en https://pypi.org/project/<package-name>/<package-version>.

Para mitigar el problema, consulte Actualización del paquete a la versión más reciente o Reemplazo del paquete por equivalentes.

El paquete solo es compatible con plataformas Windows y macOS

Abra el archivo requirements.txt con un editor de texto y consulte el paquete en https://pypi.org/project/<package-name>. Algunos paquetes solo se ejecutan en plataformas Windows o macOS. Por ejemplo, pywin32 solo se ejecuta en Windows.

El error Module Not Found puede no producirse cuando se usa Windows o macOS para el desarrollo local. Sin embargo, el paquete no se puede importar en Azure Functions, que usa Linux en el entorno de ejecución. Es probable que este problema sea causado por el uso de pip freeze para exportar el entorno virtual al archivo requirements.txt desde la máquina Windows o macOS durante la inicialización del proyecto.

Para mitigar el problema, vea Reemplazar el paquete por equivalentes o Handcraft requirements.txt.

Mitigación de ModuleNotFoundError

A continuación se indican posibles mitigaciones de riesgos para los problemas relacionados con el módulo. Use los diagnósticos mencionados anteriormente para determinar cuál de estas mitigaciones probar.

Habilitación de la compilación remota

Asegúrese de que la compilación remota esté habilitada. La manera de asegurarse depende del método de implementación.

Asegúrese de que está instalada la versión más reciente de la extensión de Azure Functions para Visual Studio Code. Compruebe que el archivo .vscode/settings.json existe y contiene la configuración "azureFunctions.scmDoBuildDuringDeployment": true. Si no es así, cree el archivo con la opción de configuración azureFunctions.scmDoBuildDuringDeployment habilitada y vuelva a implementar el proyecto.

Creación de dependencias nativas

Asegúrese de que esté instalada la versión más reciente de Docker y de Azure Functions Core Tools. Vaya a la carpeta de proyecto de la función local y use func azure functionapp publish <app-name> --build-native-deps para la implementación.

Actualización del paquete a la versión más reciente

En la versión más reciente del paquete de https://pypi.org/project/<package-name>, compruebe la sección Classifiers:. El paquete debe ser del tipo OS Independent o debe ser compatible con POSIX o POSIX :: Linux en Sistema operativo. Además, el lenguaje de programación debe contener: Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8 o Python :: 3.9.

Si los elementos del paquete son correctos, puede actualizar el paquete a la versión más reciente. Para ello, cambie la línea <package-name>~=<latest-version> del archivo requirements.txt.

Escritura a mano de requirements.txt

Algunos desarrolladores usan pip freeze > requirements.txt para generar la lista de paquetes de Python de los entornos de desarrollo. Aunque este elemento práctico debería funcionar en la mayoría de los casos, puede haber problemas en los escenarios de implementación multiplataforma; por ejemplo, desarrollar funciones localmente en Windows o macOS, pero publicarlas en una aplicación de funciones que se ejecuta en Linux. En este escenario, pip freeze puede incluir dependencias específicas para el sistema operativo inesperadas o dependencias para el entorno de desarrollo local. Estas dependencias pueden interrumpir el funcionamiento de la aplicación de funciones de Python cuando se ejecute en Linux.

El procedimiento recomendado consiste en comprobar la instrucción de importación de cada archivo .py en el código fuente del proyecto e incluir solo esos módulos en el archivo requirements.txt. Este procedimiento garantiza que la resolución de paquetes se pueda administrar correctamente en sistemas operativos diferentes.

Reemplazo del paquete por otros equivalentes

En primer lugar, revise la versión más reciente del paquete en https://pypi.org/project/<package-name>. Este paquete suele tener su propia página de GitHub. Vaya a la sección Problemas de GitHub y busque si el problema se ha corregido. Si se ha corregido, actualice el paquete a la versión más reciente.

En ocasiones, es posible que el paquete se haya integrado en la biblioteca estándar de Python (por ejemplo, pathlib). Si ese es el caso, dado que se proporciona una distribución de Python concreta en Azure Functions (Python 3.6, Python 3.7, Python 3.8 y Python 3.9), el paquete del archivo requirements.txt se debe quitar.

Sin embargo, si encuentra que el problema no se ha corregido y tiene una fecha límite, le recomendamos que realice alguna investigación para encontrar un paquete similar para el proyecto. Normalmente, la comunidad de Python le proporcionará una gran variedad de bibliotecas similares que puede usar.


Solución de problemas cuando no se puede importar "cygrpc"

Esta sección le ayuda a solucionar los errores relacionados con "cygrpc" en su aplicación de funciones de Python. Estos errores suelen generar el siguiente mensaje de error de Azure Functions:

"No se puede importar el nombre 'cygrpc' de 'grpc._cython'"

Este error se produce cuando una aplicación de funciones de Python no puede iniciarse con un intérprete de Python adecuado. La causa principal de este error es alguno de los siguientes problemas:

Diagnóstico del error de referencia de 'cygrpc'

El intérprete de Python no coincide con la arquitectura del sistema operativo

Lo más probable es que esta falta de coincidencia se deba a que se está instalado un intérprete de Python de 32 bits en el sistema operativo de 64 bits.

Si está ejecutando en un sistema operativo x64, asegúrese de que el intérprete de Python versión 3.6, 3.7, 3.8 o 3.9 también esté en la versión de 64 bits.

Puede comprobar el valor de bits del intérprete de Python ejecutando los siguientes comandos:

En Windows en PowerShell: ejecute py -c 'import platform; print(platform.architecture()[0])'.

En un shell similar a Unix, ejecute python3 -c 'import platform; print(platform.architecture()[0])'.

Si hay una discrepancia entre el valor de bits del intérprete de Python y la arquitectura del sistema operativo, descargue un intérprete de Python adecuado desde Python Software Foundation.

El intérprete de Python no es compatible con el trabajo de Python de Azure Functions

El trabajo de Python de Azure Functions solo admite Python 3.6, 3.7, 3.8 y 3.9.

Compruebe si el intérprete de Python coincide con la versión esperada mediante py --version en Windows o python3 --version en sistemas similares a Unix. Asegúrese de que el resultado devuelto sea Python 3.6.x, Python 3.7.x, Python 3.8.x o Python 3.9.x.

Si la versión de su intérprete de Python no cumple los requisitos para Azure Functions, descargue la versión del intérprete de Python 3.6, 3.7, 3.8 o 3.9 de Python Software Foundation.


Solución del problema "Python se cerró con el código 137"

Los errores de código 137 suelen deberse a problemas de memoria insuficiente en la aplicación de funciones de Python. Como resultado, recibe el mensaje de error de Azure Functions siguiente:

"Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: python salió con el código 137"

Este error se produce cuando el sistema operativo fuerza la finalización de una aplicación de funciones de Python con una señal SIGKILL. Esta señal suele indicar un error de memoria insuficiente en el proceso de Python. La plataforma de Azure Functions tiene una limitación de servicio que finaliza cualquier aplicación de funciones que supere este límite.

Visite la sección del tutorial sobre el perfil de memoria en las funciones de Python para analizar el cuello de botella de la memoria en su aplicación de funciones.


Solución del problema "Python se cerró con el código 139"

Esta sección lo ayuda a solucionar los errores de segmentación en la aplicación de funciones de Python. Estos errores suelen generar el siguiente mensaje de error de Azure Functions:

"Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException: python salió con el código 139"

Este error se produce cuando el sistema operativo fuerza la finalización de una aplicación de funciones de Python con una señal SIGSEGV. Esta señal indica la infracción de la segmentación de memoria, lo que puede resultar de una lectura o escritura inesperada en una región de memoria restringida. En las secciones siguientes, se proporciona una lista de causas principales comunes.

Regresión a partir de paquetes de terceros

En el archivo requirements.txt de la aplicación de funciones, un paquete desanclado se actualizará a la versión más reciente en cada implementación de Azure Functions. Los proveedores de estos paquetes pueden introducir regresiones en su versión más reciente. Para recuperarse de este problema, intente comentar las instrucciones de importación, deshabilitar las referencias de paquete o anclar el paquete a una versión anterior en el archivo requirements.txt.

Recuperación de los datos de un archivo .pkl con formato incorrecto

Si la aplicación de funciones utiliza la biblioteca Pickle de Python para cargar un objeto de Python a partir de un archivo .pkl, puede que el archivo contenga una cadena de bytes con formato incorrecto o una referencia de dirección no válida. Para recuperarse de este problema, intente comentar la función pickle.load().

Colisión de conexión de Pyodbc

Si la aplicación de funciones utiliza el controlador de base de datos ODBC pyodbc conocido, es posible que se abran varias conexiones en una aplicación de funciones única. Para evitar este problema, use el patrón singleton y asegúrese de que se usa solo una conexión pyodbc en toda la aplicación de funciones.


Solución de problemas relativos a errores con Protocol Buffers

La versión 4.x.x del paquete de Protocol Buffers (Protobuf) introduce cambios importantes. Dado que el proceso de trabajo de Python para Azure Functions se basa en la versión 3.x.x de este paquete, el anclaje de la aplicación de funciones para usar la versión 4.x.x puede interrumpir la aplicación. En este momento, también debe evitar el uso de bibliotecas que necesiten Protobuf v4.x.x.

Registros de errores de ejemplo:

 [Information] File "/azure-functions-host/workers/python/3.8/LINUX/X64/azure_functions_worker/protos/shared/NullableTypes_pb2.py", line 38, in <module>
 [Information] _descriptor.FieldDescriptor(
 [Information] File "/home/site/wwwroot/.python_packages/lib/site-packages/google/protobuf/descriptor.py", line 560, in __new__
 [Information] _message.Message._CheckCalledFromGeneratedFile()
 [Error] TypeError: Descriptors cannot be created directly.
 [Information] If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
 [Information] If you cannot immediately regenerate your protos, some other possible workarounds are:
 [Information] 1. Downgrade the protobuf package to 3.20.x or lower.
 [Information] 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
 [Information] More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates

Puede mitigar este problema de dos maneras:

  • Establezca la configuración de la aplicación PYTHON_ISOLATE_WORKER_DEPENDENCIES en un valor de 1.

  • Ancle Protobuf a un elemento distinto de la versión 4.x.x., como en el ejemplo siguiente:

    protobuf >= 3.19.3, == 3.*
    

No se admiten varios trabajos de Python

En este momento, no se admite la configuración de varios trabajos de Python en el modelo de programación v2. Más concretamente, la habilitación de la simultaneidad inteligente estableciendo FUNCTIONS_WORKER_PROCESS_COUNT en un número mayor que 1 no se admite para las funciones desarrolladas mediante el modelo v2.

Solucionar el problema "no se pudo cargar el archivo o ensamblaje"

Si recibe este error, puede deberse a que usa el modelo de programación v2. Este error se debe a un problema conocido que se resolverá en una próxima versión.

Este error específico podría indicar:

"DurableTask.Netherite.AzureFunctions: No se pudo cargar el archivo o ensamblado "Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289".
El sistema no encuentra el archivo especificado."

Este error se puede producir por un problema con la forma en que se almacenaba en caché la agrupación de extensiones. Para solucionar este problema, puede ejecutar el siguiente comando con --verbose para ver más detalles:

func host start --verbose

Después de ejecutar el comando, si observa que Loading startup extension <> no va seguido de Loaded extension <> para cada extensión, es probable que tenga un problema de almacenamiento en caché.

Para solucionar este problema:

  1. Busque la ruta de acceso .azure-functions-core-tools mediante la ejecución de:

    func GetExtensionBundlePath
    
  2. Elimine el directorio .azure-functions-core-tools.

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

Solucionar el problema "no se puede resolver la conexión de Azure Storage"

Es posible que vea este error en la salida local como el mensaje siguiente:

"Microsoft.Azure.WebJobs.Extensions.DurableTask: No se puede resolver la conexión de Azure Storage denominada 'Storage'.
Value cannot be null. (Parámetro 'provider')"

Este error es el resultado de cómo se cargan las extensiones desde la agrupación localmente. Para resolver este error, realice una de las siguientes acciones:

  • Use un emulador de almacenamiento como Azurite. Esta es una buena opción cuando no planea usar una cuenta de almacenamiento en la aplicación de funciones.

  • Cree una cuenta de almacenamiento y agregue una cadena de conexión a la variable de entorno AzureWebJobsStorage en el archivo localsettings.json. Use esta opción cuando use un desencadenador o enlace de cuenta de almacenamiento con la aplicación, o si tiene una cuenta de almacenamiento existente. Para comenzar, consulte Crear una cuenta de almacenamiento.

Problema con la implementación

En el Azure Portal, seleccione Configuración>Configuración y asegúrese de que la configuración de la aplicación AzureWebJobsFeatureFlags tenga un valor de EnableWorkerIndexing. Si no se encuentra, agregue esta configuración a la aplicación de funciones.

Pasos siguientes

Si no puede resolver el problema, póngase en contacto con el equipo de Azure Functions: