Solución de errores de Python en Azure Functions


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:

Cannot import name 'cygrpc' from '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 se deba a que un intérprete de Python de 32 bits está instalado en el sistema operativo de 64 bits.

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

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

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

En un shell similar a Unix: 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 y 3.8. 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 Python 3.6.x, Python 3.7.x o Python 3.8.x.

Si la versión del intérprete de Python no cumple con nuestra expectativa, descargue el intérprete Python 3.6, 3.7 o 3.8 desde 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 exited with code 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 finalizará 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 exited with code 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 una infracción de la segmentación de la memoria que puede deberse a 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 .pkl contenga una cadena de bytes con formato incorrecto o una referencia de dirección no válida en él. 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.


Pasos siguientes

Si no puede resolver el problema, informe al equipo de Functions:

A continuación, se muestra una lista de las guías de solución de problemas comunes en 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:

Exception: ModuleNotFoundError: No module named '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 la configuración de aplicación mencionada anteriormente, 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 opciones se ajusta a sus necesidades, diríjase a https://<app-name>.scm.azurewebsites.net/DebugConsole y revele 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.

Consulte Habilitación de la compilación remota o Creación de dependencias nativas para consultar la mitigación.

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: . Si el valor de la etiqueta no contiene la palabra linux, este podría ser el problema.

Las funciones de Python solo se ejecutan en Linux con Azure: Azure Functions Runtime 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. El uso de la marca --build local en Core Tools o en herramientas de terceros u obsoletas puede causar el uso de archivos binarios anteriores.

Consulte Habilitación de la compilación remota o Creación de dependencias nativas para consultar la mitigación.

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 o Python :: 3.8, 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 aplicación de funciones, elija Resource Explorery seleccione Ir.

Open the Resource Explorer for the function app in the portal

Una vez que se haya cargado el explorador, busque LinuxFxVersion, que mostrará la versión de Python.

Consulte Actualización del paquete a la versión más reciente o Reemplazo del paquete por otros equivalentes para consultar la mitigación.

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 señalar claramente a los módulos incompatibles. Por ejemplo, en azure 4.0.0, hay una instrucción como la siguiente:

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>.

Consulte Actualización del paquete a la versión más reciente o Reemplazo del paquete por otros equivalentes para consultar la mitigación.

El paquete solo es compatible con plataformas Windows o 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. La causa más probable es 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.

Consulte Reemplazo del paquete por otros equivalentes o Escritura a mano de requirements.txt para consultar la mitigación.

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 anteriores para determinar cuál de estas mitigaciones debe probar.

Habilitación de la compilación remota

Asegúrese de que la compilación remota esté habilitada. La manera de hacer esto 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 existe el archivo .vscode/settings.json y que contiene la configuración "azureFunctions.scmDoBuildDuringDeployment": true. De lo contrario, 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 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

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

Si los valores 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 Import de cada archivo .py en el código fuente del proyecto e incluir solo esos módulos en el archivo requirements.txt. Esto garantiza que la resolución de paquetes se administrará correctamente en sistemas operativos diferentes.

Reemplazo del paquete por otros equivalentes

En primer lugar, es necesario revisar la versión más reciente del paquete en https://pypi.org/project/<package-name>. Normalmente, este paquete tiene su propia página de GitHub; vaya a la sección Issues (Incidencias) en GitHub y busque si se ha corregido el problema. Si ese es el caso, 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 y Python 3.8), el paquete se debe quitar del archivo requirements.txt.

Sin embargo, si el problema no se ha corregido y tiene una fecha límite, se recomienda que investigue un poco y busque un paquete similar para su proyecto. Normalmente, la comunidad de Python le proporcionará una gran variedad de bibliotecas similares que puede usar.