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.

Nota:

El modelo de programación de Python v2 solo se admite en el entorno de ejecución de funciones 4.x. Para más información, consulte Selección de un destino para versiones de runtime de Azure Functions.

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

Solución de problemas: 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 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 las sugerencias resuelven 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 proporciona una gran variedad de bibliotecas similares que puede usar.

Deshabilitación de la marca de aislamiento de dependencia

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


Solución del problema: 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'

Hay varias causas posibles de errores que hacen referencia a cygrpc, que se detallan en esta sección.

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 versiones específicas de Python.

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 es una de las versiones admitidas de Python.

Si la versión de su intérprete de Python no cumple los requisitos de Azure Functions, descargue en su lugar una versión del intérprete de Python que admita Functions 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 se cerró 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.

Para analizar el cuello de botella en la memoria de la aplicación de funciones, consulte Generar perfiles de la aplicación de funciones de Python en el entorno de desarrollo local.


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 se cerró 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 actualiza a la versión más reciente en cada implementación en Azure. Las actualizaciones de paquetes podrían introducir regresiones que afecten a la aplicación. Para recuperarse de este problema, comente las instrucciones de importación, deshabilite las referencias de paquete o ancle el paquete a una versión anterior del 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.


Error en la sincronización de desencadenadores

El error Sync triggers failed puede deberse a varios problemas. Una posible causa es un conflicto entre las dependencias definidas por el cliente y los módulos integrados de Python cuando las funciones se ejecutan en un plan de App Service. Para más información, consulte Administración de paquetes.


Solución del problema: "no se pudo cargar el archivo o ensamblado"

Puede ver este error cuando se ejecuta localmente mediante el modelo de programación v2. Este error se debe a un problema conocido que se resolverá en una próxima versión.

Este es un mensaje de ejemplo de este error:

"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 puede encontrar el archivo especificado.

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

func host start --verbose

Es probable que vea este problema de almacenamiento en caché cuando vea un registro de carga de extensiones como Loading startup extension <> que no va seguido de Loaded extension <>.

Para solucionar este problema:

  1. Para buscar la ruta de .azure-functions-core-tools, ejecute:

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

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

El directorio de caché se volverá a crear si ejecuta Core Tools de nuevo.

Solución del 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.

Funciones no encontradas después de la implementación

Hay varios problemas comunes de compilación que pueden hacer que el host no encuentre algunas funciones de Python después de una implementación aparentemente correcta:

  • El grupo de agentes debe ejecutarse en Ubuntu para garantizar que los paquetes se restauran correctamente desde el paso de compilación. Asegúrese de que la plantilla de implementación requiere un entorno de Ubuntu para la compilación e implementación.

  • Cuando la aplicación de funciones no está en la raíz del repositorio de origen, asegúrese de que el paso pip install haga referencia a la ubicación correcta en la que se va a crear la carpeta .python-packages. Tenga en cuenta que esta ubicación distingue entre mayúsculas y minúsculas, como en este ejemplo de comando:

    pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
    
  • La plantilla debe generar un paquete de implementación que se pueda cargar en /home/site/wwwroot. En Azure Pipelines, esto se realiza mediante la tarea ArchiveFiles.

Problemas de desarrollo en Azure Portal

Cuando use Azure Portal, tenga en cuenta estos problemas conocidos y sus soluciones alternativas:

  • Para eliminar una función de una aplicación de funciones del portal, quite el código de función del propio archivo. El botón Eliminar no funciona para quitar la función al usar el modelo de programación de Python v2.
  • Al crear una función en el portal, es posible que se le recomiende usar una herramienta diferente para el desarrollo. Hay varios escenarios en los que no se puede editar el código en el portal, incluido cuando se ha detectado un error de sintaxis. En estos escenarios, use Visual Studio Code o Azure Functions Core Tools para desarrollar y publicar el código de la función.

Pasos siguientes

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