Resolver erros do Python nas Funções do Azure

Este artigo fornece informações para ajudá-lo a solucionar erros com suas funções Python no Azure Functions. Este artigo suporta os modelos de programação v1 e v2. Escolha o modelo que deseja usar no seletor na parte superior do artigo.

Nota

O modelo de programação Python v2 só é suportado no tempo de execução das funções 4.x. Para obter mais informações, consulte Visão geral das versões de tempo de execução do Azure Functions.

Aqui estão as seções de solução de problemas comuns em funções Python:

Solução de problemas: ModuleNotFoundError

Esta seção ajuda você a solucionar erros relacionados ao módulo em seu aplicativo de função Python. Esses erros normalmente resultam na seguinte mensagem de erro do Azure Functions:

Exceção: ModuleNotFoundError: Nenhum módulo chamado 'module_name'.

Este erro ocorre quando um aplicativo de função Python não consegue carregar um módulo Python. A causa raiz para esse erro é um dos seguintes problemas:

Ver ficheiros de projeto

Para identificar a causa real do problema, você precisa obter os arquivos de projeto Python que são executados em seu aplicativo de função. Se você não tiver os arquivos de projeto em seu computador local, poderá obtê-los de uma das seguintes maneiras:

  • Se o aplicativo de função tiver uma configuração de WEBSITE_RUN_FROM_PACKAGE aplicativo e seu valor for uma URL, baixe o arquivo copiando e colando a URL em seu navegador.
  • Se a função da aplicação estiver WEBSITE_RUN_FROM_PACKAGE definida como 1, aceda ao https://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages URL mais recente e transfira-o a partir do URL mais recente href .
  • Se o aplicativo de função não tiver nenhuma das configurações do aplicativo anterior, vá para https://<app-name>.scm.azurewebsites.net/api/settings e localize o URL em SCM_RUN_FROM_PACKAGE. Transfira o ficheiro copiando e colando o URL no seu browser.
  • Se as sugestões resolverem /home/site/wwwrooto problema, aceda ao https://<app-name>.scm.azurewebsites.net/DebugConsole conteúdo em .

O restante deste artigo ajuda você a solucionar possíveis causas desse erro inspecionando o conteúdo do seu aplicativo de função, identificando a causa raiz e resolvendo o problema específico.

Diagnosticar ModuleNotFoundError

Esta seção detalha possíveis causas raiz de erros relacionados ao módulo. Depois de descobrir qual é a provável causa raiz, você pode ir para a mitigação relacionada.

O pacote não pode ser encontrado

Vá para .python_packages/lib/python3.6/site-packages/<package-name> ou .python_packages/lib/site-packages/<package-name>. Se o caminho do arquivo não existir, esse caminho ausente é provavelmente a causa raiz.

O uso de ferramentas de terceiros ou desatualizadas durante a implantação pode causar esse problema.

Para atenuar esse problema, consulte Habilitar compilação remota ou Criar dependências nativas.

O pacote não é resolvido com a roda Linux adequada

Vá para .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info ou .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Use seu editor de texto favorito para abrir o arquivo de roda e verifique a seção Tag: . O problema pode ser que o valor da tag não contém linux.

As funções Python são executadas apenas no Linux no Azure. O tempo de execução do Functions v2.x é executado no Debian Stretch, e o tempo de execução v3.x é executado no Debian Buster. Espera-se que o artefato contenha os binários Linux corretos. Quando você usa o sinalizador --build local em Ferramentas principais, de terceiros ou ferramentas desatualizadas, isso pode fazer com que binários mais antigos sejam usados.

Para atenuar o problema, consulte Habilitar compilação remota ou Criar dependências nativas.

O pacote é incompatível com a versão do interpretador Python

Vá para .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info ou .python_packages/lib/site-packages/<package-name>-<version>-dist-info. No editor de texto, abra o arquivo METADADOS e verifique a seção Classificadores: . Se a seção não contiver Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8, ou Python :: 3.9, a versão do pacote é muito antiga ou, mais provavelmente, já está fora de manutenção.

Você pode verificar a versão Python do seu aplicativo de função no portal do Azure. Navegue até a página de recursos Visão geral do aplicativo de função para encontrar a versão em tempo de execução. A versão de tempo de execução dá suporte a versões Python conforme descrito na visão geral das versões de tempo de execução do Azure Functions.

Para atenuar o problema, consulte Atualizar o pacote para a versão mais recente ou Substituir o pacote por equivalentes.

O pacote entra em conflito com outros pacotes

Se você verificou que o pacote é resolvido corretamente com as rodas Linux adequadas, pode haver um conflito com outros pacotes. Em certos pacotes, a documentação do PyPi pode esclarecer os módulos incompatíveis. Por exemplo, no azure 4.0.0, você encontra a seguinte instrução:

Este pacote não é compatível com azure-storage. Se você instalou o azure-storage ou se instalou o azure 1.x/2.x e não desinstalou o azure-storage, você deve desinstalar o azure-storage primeiro.

Você pode encontrar a documentação para a versão do seu pacote em https://pypi.org/project/<package-name>/<package-version>.

Para atenuar o problema, consulte Atualizar o pacote para a versão mais recente ou Substituir o pacote por equivalentes.

O pacote suporta apenas as plataformas Windows e macOS

Abra o requirements.txt com um editor de texto e verifique o pacote em https://pypi.org/project/<package-name>. Alguns pacotes são executados apenas em plataformas Windows e macOS. Por exemplo, pywin32 é executado apenas no Windows.

O Module Not Found erro pode não ocorrer quando você estiver usando o Windows ou macOS para desenvolvimento local. No entanto, o pacote falha ao importar no Azure Functions, que usa Linux em tempo de execução. É provável que esse problema seja causado pelo uso pip freeze para exportar o ambiente virtual para requirements.txt de sua máquina Windows ou macOS durante a inicialização do projeto.

Para atenuar o problema, consulte Substituir o pacote por equivalentes ou Manual requirements.txt.

Mitigar ModuleNotFoundError

A seguir estão as possíveis mitigações para problemas relacionados ao módulo. Use os diagnósticos mencionados anteriormente para determinar qual dessas atenuações tentar.

Ativar compilação remota

Certifique-se de que a compilação remota está ativada. A maneira como você se certifica depende do seu método de implantação.

Certifique-se de que a versão mais recente da extensão do Azure Functions para Visual Studio Code está instalada. Verifique se o arquivo .vscode/settings.json existe e se ele contém a configuração "azureFunctions.scmDoBuildDuringDeployment": true. Caso contrário, crie o arquivo com a configuração habilitada azureFunctions.scmDoBuildDuringDeployment e reimplante o projeto.

Crie dependências nativas

Certifique-se de que as versões mais recentes do Docker e do Azure Functions Core Tools estão instaladas. Vá para a pasta do projeto da função local e use func azure functionapp publish <app-name> --build-native-deps para implantação.

Atualize o pacote para a versão mais recente

Na versão mais recente do pacote do https://pypi.org/project/<package-name>, verifique a seção Classificadores: . O pacote deve ser OS Independent, ou compatível com POSIX ou POSIX :: Linux no sistema operacional. Além disso, a linguagem de programação deve conter: Python :: 3, Python :: 3.6, Python :: 3.7, Python :: 3.8, ou Python :: 3.9.

Se esses itens de pacote estiverem corretos, você poderá atualizá-lo para a versão mais recente alterando a linha <package-name>~=<latest-version> no requirements.txt.

Artesanato requirements.txt

Alguns desenvolvedores usam pip freeze > requirements.txt para gerar a lista de pacotes Python para seus ambientes de desenvolvimento. Embora essa conveniência deva funcionar na maioria dos casos, pode haver problemas em cenários de implantação entre plataformas, como o desenvolvimento de funções localmente no Windows ou macOS, mas a publicação em um aplicativo funcional, que é executado no Linux. Nesse cenário, pip freeze pode introduzir dependências específicas do sistema operacional inesperadas ou dependências para seu ambiente de desenvolvimento local. Essas dependências podem quebrar o aplicativo de função Python quando ele está sendo executado no Linux.

A prática recomendada é verificar a instrução de importação de cada arquivo de .py no código-fonte do projeto e, em seguida, fazer check-in apenas dos módulos no arquivo requirements.txt . Essa prática garante que a resolução de pacotes possa ser tratada corretamente em diferentes sistemas operacionais.

Substitua o pacote por equivalentes

Primeiro, dê uma olhada na versão mais recente do pacote em https://pypi.org/project/<package-name>. Este pacote geralmente tem sua própria página no GitHub. Vá para a seção Problemas no GitHub e pesquise para ver se o problema foi corrigido. Se tiver sido corrigido, atualize o pacote para a versão mais recente.

Às vezes, o pacote pode ter sido integrado à Python Standard Library (como pathlib). Em caso afirmativo, como fornecemos uma determinada distribuição Python no Azure Functions (Python 3.6, Python 3.7, Python 3.8 e Python 3.9), o pacote em seu arquivo requirements.txt deve ser removido.

No entanto, se você estiver descobrindo que o problema não foi corrigido e estiver dentro de um prazo, recomendamos que você pesquise para encontrar um pacote semelhante para o seu projeto. Normalmente, a comunidade Python fornece uma grande variedade de bibliotecas semelhantes que você pode usar.

Desativar sinalizador de isolamento de dependência

Defina a configuração do aplicativo PYTHON_ISOLATE_WORKER_DEPENDENCIES como um valor de 0.


Resolução de problemas: não é possível importar 'cygrpc'

Esta seção ajuda você a solucionar erros relacionados ao 'cygrpc' em seu aplicativo de função Python. Esses erros normalmente resultam na seguinte mensagem de erro do Azure Functions:

Não é possível importar o nome 'cygrpc' de 'grpc._cython'

Este erro ocorre quando um aplicativo de função Python falha ao iniciar com um interpretador Python adequado. A causa raiz para esse erro é um dos seguintes problemas:

Diagnosticar o erro de referência 'cygrpc'

Existem várias causas possíveis para erros que fazem referência cygrpc, que são detalhadas nesta seção.

O interpretador Python não corresponde à arquitetura do sistema operacional

Essa incompatibilidade é provavelmente causada por um interpretador Python de 32 bits sendo instalado em seu sistema operacional de 64 bits.

Se você estiver executando em um sistema operacional x64, verifique se o interpretador Python versão 3.6, 3.7, 3.8 ou 3.9 também está em uma versão de 64 bits.

Você pode verificar a bitness do seu interpretador Python executando os seguintes comandos:

No Windows no PowerShell, execute py -c 'import platform; print(platform.architecture()[0])'.

Em um shell Unix-like, execute python3 -c 'import platform; print(platform.architecture()[0])'.

Se houver uma incompatibilidade entre o bitness do interpretador Python e a arquitetura do sistema operacional, faça o download de um interpretador Python adequado da Python Software Foundation.

O interpretador Python não é suportado pelo Azure Functions Python Worker

O Azure Functions Python Worker suporta apenas versões específicas do Python.

Verifique se o seu interpretador Python corresponde à sua versão esperada no py --version Windows ou python3 --version em sistemas Unix-like. Certifique-se de que o resultado de retorno é uma das versões suportadas do Python.

Se sua versão do interpretador Python não atender aos requisitos do Azure Functions, baixe uma versão do interpretador Python suportada pelo Functions da Python Software Foundation.


Solução de problemas: python saiu com o código 137

Os erros de código 137 geralmente são causados por problemas de falta de memória em seu aplicativo de função Python. Como resultado, você recebe a seguinte mensagem de erro do Azure Functions:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : python saiu com o código 137

Este erro ocorre quando um aplicativo de função Python é forçado a encerrar pelo sistema operacional com um SIGKILL sinal. Esse sinal geralmente indica um erro de falta de memória em seu processo Python. A plataforma Azure Functions tem uma limitação de serviço que encerra todos os aplicativos de função que excedem esse limite.

Para analisar o afunilamento de memória em seu aplicativo de função, consulte Profile Python function app in local development environment.


Solução de problemas: python saiu com o código 139

Esta seção ajuda você a solucionar erros de falha de segmentação em seu aplicativo de função Python. Esses erros normalmente resultam na seguinte mensagem de erro do Azure Functions:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : python saiu com o código 139

Este erro ocorre quando um aplicativo de função Python é forçado a encerrar pelo sistema operacional com um SIGSEGV sinal. Este sinal indica violação da segmentação de memória, que pode resultar de uma leitura inesperada de ou gravação em uma região de memória restrita. Nas seções a seguir, fornecemos uma lista de causas raiz comuns.

Uma regressão de pacotes de terceiros

No arquivo requirements.txt do seu aplicativo de função, um pacote não fixado é atualizado para a versão mais recente durante cada implantação no Azure. As atualizações de pacotes podem potencialmente introduzir regressões que afetam seu aplicativo. Para se recuperar desses problemas, comente as instruções de importação, desative as referências do pacote ou fixe o pacote em uma versão anterior no requirements.txt.

Desseleção de um arquivo .pkl malformado

Se seu aplicativo de função estiver usando a biblioteca de pickle Python para carregar um objeto Python de um arquivo .pkl , é possível que o arquivo contenha uma cadeia de bytes malformada ou uma referência de endereço inválida. Para se recuperar desse problema, tente comentar a pickle.load() função.

Colisão de conexão Pyodbc

Se seu aplicativo de função estiver usando o popular driver de banco de dados ODBC pyodbc, é possível que várias conexões estejam abertas em um único aplicativo de função. Para evitar esse problema, use o padrão singleton e certifique-se de que apenas uma conexão pyodbc seja usada no aplicativo de função.


Falha nos gatilhos de sincronização

O erro Sync triggers failed pode ser causado por vários problemas. Uma causa potencial é um conflito entre dependências definidas pelo cliente e módulos internos do Python quando suas funções são executadas em um plano do Serviço de Aplicativo. Para obter mais informações, consulte Gerenciamento de pacotes.


Solução de problemas: não foi possível carregar o arquivo ou o assembly

Você pode ver esse erro quando estiver executando localmente usando o modelo de programação v2. Este erro é causado por um problema conhecido a ser resolvido em uma versão futura.

Esta é uma mensagem de exemplo para este erro:

DurableTask.Netherite.AzureFunctions: Não foi possível carregar o arquivo ou assembly 'Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289'.
O sistema não consegue encontrar o ficheiro especificado.

O erro ocorre devido a um problema com a forma como o pacote de extensão foi armazenado em cache. Para solucionar o problema, execute este comando com --verbose para ver mais detalhes:

func host start --verbose

É provável que você esteja vendo esse problema de cache quando vir um log de carregamento de extensão como Loading startup extension <> esse não é seguido pelo Loaded extension <>.

Para resolver este problema:

  1. Encontre o .azure-functions-core-tools caminho executando:

    func GetExtensionBundlePath
    
  2. Exclua o .azure-functions-core-tools diretório.

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

O diretório de cache é recriado quando você executa as Ferramentas Principais novamente.

Resolução de problemas: não é possível resolver a ligação de Armazenamento do Azure

Poderá ver este erro na saída local como a seguinte mensagem:

Microsoft.Azure.WebJobs.Extensions.DurableTask: Não é possível resolver a conexão de Armazenamento do Azure chamada 'Storage'.
o valor não pode ser nulo. (Parâmetro 'provedor')

Este erro é resultado de como as extensões são carregadas do pacote localmente. Para resolver esse erro, execute uma das seguintes ações:

  • Use um emulador de armazenamento como o Azurite. Essa opção é boa quando você não está planejando usar uma conta de armazenamento em seu aplicativo de função.

  • Crie uma conta de armazenamento e adicione uma cadeia de conexão à AzureWebJobsStorage variável de ambiente no arquivo localsettings.json . Use essa opção quando estiver usando um gatilho ou associação de conta de armazenamento com seu aplicativo ou se tiver uma conta de armazenamento existente. Para começar a utilizar, veja Criar uma conta de armazenamento.

Funções não encontradas após a implantação

Há vários problemas comuns de compilação que podem fazer com que as funções Python não sejam encontradas pelo host após uma implantação aparentemente bem-sucedida:

  • O pool de agentes deve estar em execução no Ubuntu para garantir que os pacotes sejam restaurados corretamente a partir da etapa de compilação. Certifique-se de que seu modelo de implantação requer um ambiente Ubuntu para construção e implantação.

  • Quando o aplicativo de função não estiver na raiz do repositório de origem, certifique-se de que a pip install etapa faça referência ao local correto no qual criar a .python-packages pasta. Lembre-se de que esse local diferencia maiúsculas de minúsculas, como neste exemplo de comando:

    pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
    
  • O modelo deve gerar um pacote de implantação que possa ser carregado no /home/site/wwwroot. No Azure Pipelines, isso é feito pela ArchiveFiles tarefa.

Problemas de desenvolvimento no portal do Azure

Ao usar o portal do Azure, leve em consideração estes problemas conhecidos e suas soluções alternativas:

  • Para excluir uma função de um aplicativo de função no portal, remova o código da função do próprio arquivo. O botão Excluir não funciona para remover a função ao usar o modelo de programação Python v2.
  • Ao criar uma função no portal, você pode ser aconselhado a usar uma ferramenta diferente para desenvolvimento. Há vários cenários em que você não pode editar seu código no portal, incluindo quando um erro de sintaxe foi detetado. Nesses cenários, use o Visual Studio Code ou as Ferramentas Principais do Azure Functions para desenvolver e publicar seu código de função.

Próximos passos

Se não conseguir resolver o problema, contacte a equipa do Azure Functions: