Устранение неполадок при появлении ошибок Python в Функциях Azure
В этой статье содержатся сведения, помогающие устранять ошибки с функциями Python в Функции Azure. В этой статье поддерживаются как модели программирования версии 1, так и версии 2. Выберите модель, которую вы хотите использовать в селекторе в верхней части статьи.
Примечание.
Модель программирования Python версии 2 поддерживается только в среде выполнения функций 4.x. Дополнительные сведения см. в обзоре версий среды выполнения Функций Azure.
Ниже приведены разделы по устранению неполадок для распространенных проблем в функциях Python:
В частности, с моделью версии 2 приведены некоторые известные проблемы и их обходные пути.
- Не удалось загрузить файл или сборку
- Не удается разрешить подключение служба хранилища Azure с именем Storage
Общие руководства по устранению неполадок для функций Python:
Устранение неполадок: ModuleNotFoundError
Инструкции из этого раздела помогут вам устранить ошибки, связанные с модулями, в вашем приложении-функции Python. Эти ошибки обычно приводят к появлению следующих сообщений об ошибках в Функциях Azure.
Исключение: ModuleNotFoundError: модуль с именем "module_name".
Эта ошибка возникает, когда приложению-функции Python не удается загрузить модуль Python. Основными причинами этой ошибки является одна из следующих проблем:
- не удается найти пакет;
- пакет не разрешается с помощью нужной библиотеки wheel в Linux;
- пакет несовместим с версией интерпретатора Python;
- пакет конфликтует с другими пакетами;
- Пакет поддерживает только платформы Windows и macOS
Просмотр файлов проекта
Чтобы узнать фактическую причину проблемы, необходимо получить файлы проекта Python, которые выполняются в вашем приложении-функции. Если у вас нет файлов проекта на локальном компьютере, их можно получить одним из следующих способов.
- Если приложение-функция имеет параметр приложения и его значение является URL-адресом
WEBSITE_RUN_FROM_PACKAGE
, скачайте файл, скопируйте и вставьте URL-адрес в браузер. - Если для приложения-функции задано
WEBSITE_RUN_FROM_PACKAGE
значение1
, перейдитеhttps://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages
к файлу и скачайте его из последнегоhref
URL-адреса. - Если приложение-функция не имеет ни одного из предыдущих параметров приложения, перейдите
https://<app-name>.scm.azurewebsites.net/api/settings
и найдите URL-адрес в разделеSCM_RUN_FROM_PACKAGE
. Скачайте файл, скопируйте и вставьте URL-адрес в браузер. - Если предложения устраняют проблему, перейдите
https://<app-name>.scm.azurewebsites.net/DebugConsole
к содержимому и просмотрите его в разделе/home/site/wwwroot
.
Дальше в этой статье приведены советы по устранению возможных причин этой ошибки путем проверки содержимого приложения-функции, определения основной причины и решения конкретной проблемы.
Диагностика ошибки ModuleNotFoundError
В этом разделе описаны возможные основные причины ошибок, связанных с модулем. После того как вы выясните, какая это может быть причина, можно приступать к устранению проблемы.
Не удается найти пакет
Перейдите на страницу .python_packages/lib/python3.6/site-packages/<package-name>
или .python_packages/lib/site-packages/<package-name>
. Если путь к файлу не существует, скорее всего, этот путь является основной причиной проблемы.
Использование сторонних или устаревших средств во время развертывания может вызвать эту проблему.
Чтобы устранить эту проблему, см. статью "Включить удаленную сборку " или "Сборка собственных зависимостей".
Пакет не разрешается с соответствующим колесом Linux
Перейдите на страницу .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info
или .python_packages/lib/site-packages/<package-name>-<version>-dist-info
. Откройте файл wheel в привычном текстовом редакторе и проверьте раздел Tag:. Проблема может быть в том, что значение тега не содержит Linux.
Функции Python выполняются только в Linux в Azure. Среда выполнения Функций версии 2.x выполняется в Debian Stretch, а среда выполнения версии 3.x выполняется в Debian Buster. Артефакт должен содержать правильные двоичные файлы Linux. При использовании флага --build local
в Core Tools, сторонних или устаревших средствах может потребоваться использовать старые двоичные файлы.
Чтобы устранить проблему, см. раздел "Включить удаленную сборку " или "Сборка собственных зависимостей".
Пакет несовместим с версией интерпретатора Python
Перейдите на страницу .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info
или .python_packages/lib/site-packages/<package-name>-<version>-dist-info
. В текстовом редакторе откройте файл METADATA и проверьте классификаторы: раздел. Если раздел не содержит Python :: 3
, , Python :: 3.8
Python :: 3.6
Python :: 3.7
или , версия пакета либо слишком старая, либоPython :: 3.9
, скорее всего, она уже не поддерживается.
Версию приложения-функции Python можно проверить на портале Azure. Перейдите на страницу ресурса обзора приложения-функции, чтобы найти версию среды выполнения. Версия среды выполнения поддерживает версии Python, как описано в обзоре версий среды выполнения Функции Azure.
Чтобы устранить проблему, ознакомьтесь с обновлением пакета до последней версии или заменой пакета эквивалентами.
Пакет конфликтует с другими пакетами
Если вы проверили правильность разрешения пакета с соответствующими колесами Linux, может возникнуть конфликт с другими пакетами. В некоторых пакетах документация PyPi может уточнить несовместимые модули. Например, в azure 4.0.0
приведенном ниже операторе:
Этот пакет несовместим с хранилищем Azure. Если вы установили хранилище Azure или установили azure 1.x/2.x и не удалили хранилище Azure, сначала необходимо удалить хранилище Azure.
Документацию по вашей версии пакета можно найти на странице https://pypi.org/project/<package-name>/<package-version>
.
Чтобы устранить проблему, ознакомьтесь с обновлением пакета до последней версии или заменой пакета эквивалентами.
Пакет поддерживает только платформы Windows и macOS
Откройте requirements.txt
в текстовом редакторе и проверьте пакет в https://pypi.org/project/<package-name>
. Некоторые пакеты выполняются только на платформах Windows и macOS. Например, pywin32 работает только в Windows.
Ошибка Module Not Found
может не возникать при использовании Windows или macOS для локальной разработки. Однако пакет не удается импортировать в Функции Azure, в которых используется Linux в среде выполнения. Эта проблема, скорее всего, будет вызвана использованием pip freeze
экспорта виртуальной среды в requirements.txt с компьютера Windows или macOS во время инициализации проекта.
Чтобы устранить проблему, см . раздел "Заменить пакет эквивалентами " или "Ручное requirements.txt".
Устранение ошибки ModuleNotFoundError
Ниже приведены потенциальные способы устранения проблем, связанных с модулем. Используйте ранее упомянутые диагностики , чтобы определить, какие из этих мер помогут попробовать.
Включение удаленной сборки
Убедитесь, что удаленная сборка включена. Способ, который необходимо убедиться в том, зависит от метода развертывания.
Убедитесь, что установлена последняя версия расширения Функций Azure для Visual Studio Code. Убедитесь, что vscode/settings.json файл существует, и он содержит параметр "azureFunctions.scmDoBuildDuringDeployment": true
. Если это не так, создайте файл с включенным параметром azureFunctions.scmDoBuildDuringDeployment
и повторно разверните проект.
Создание собственных зависимостей
Убедитесь, что установлены последние версии Docker и Функции Azure Core Tools. Перейдите в папку проекта локальной функции и используйте func azure functionapp publish <app-name> --build-native-deps
для развертывания.
Обновление пакета до последней версии
В последней https://pypi.org/project/<package-name>
версии пакета проверьте классификаторы: раздел. Пакет должен быть OS Independent
или совместим с POSIX
или POSIX :: Linux
в разделе Операционная система. Кроме того, язык программирования должен содержать: Python :: 3
, Python :: 3.6
, Python :: 3.7
, Python :: 3.8
или Python :: 3.9
.
Если эти элементы пакета верны, можно обновить пакет до последней версии, изменив строку <package-name>~=<latest-version>
в requirements.txt.
Обработка файла requirements.txt вручную
Некоторые разработчики используют pip freeze > requirements.txt
, чтобы создать список пакетов Python для своих сред разработки. Хотя эта удобная функция должна работать в большинстве случаев, в сценариях межплатформенного развертывания могут возникать проблемы, например когда разработка функций выполняется локально в Windows или macOS, а публикуются они в приложении-функции, работающем в Linux. В этом сценарии pip freeze
может привести к непредвиденным зависимостям от операционной системы или зависимостям от локальной среды разработки. Эти зависимости могут разорвать приложение-функцию Python при запуске в Linux.
Рекомендуется проверить инструкцию импорта из каждого файла .py в исходном коде проекта, а затем проверить только модули в файле requirements.txt . Эта практика гарантирует, что разрешение пакетов можно правильно обрабатывать в разных операционных системах.
Замена пакета на эквивалент
Во-первых, ознакомьтесь с последней версией пакета https://pypi.org/project/<package-name>
. Этот пакет обычно имеет собственную страницу GitHub. Перейдите в раздел "Проблемы " на сайте GitHub и выполните поиск, чтобы узнать, устранена ли проблема. Если оно было исправлено, обновите пакет до последней версии.
Иногда пакет может быть интегрирован в стандартную библиотеку Python (например pathlib
). Если это так, так как мы предоставляем определенное распределение Python в Функции Azure (Python 3.6, Python 3.7, Python 3.8 и Python 3.9), пакет в файле requirements.txt следует удалить.
Однако если вы обнаружите, что проблема не устранена, и вы находитесь в крайнем сроке, мы рекомендуем вам выполнить некоторые исследования, чтобы найти аналогичный пакет для вашего проекта. Как правило, сообщество Python предоставляет широкий спектр аналогичных библиотек, которые можно использовать.
Отключение флага изоляции зависимостей
Присвойте параметру приложения PYTHON_ISOLATE_WORKER_DEPENDENCIES значение 0
.
Устранение неполадок: не удается импортировать cygrpc
Этот раздел поможет устранить ошибки, связанные с cygrpc, в приложении-функции Python. Эти ошибки обычно приводят к появлению следующих сообщений об ошибках в Функциях Azure.
Не удается импортировать имя cygrpc из "grpc._cython"
Эта ошибка возникает, когда приложение-функция Python не запускается с подходящим интерпретатором Python. Основными причинами этой ошибки является одна из следующих проблем:
- Интерпретатор Python не соответствует архитектуре ОС.
- Интерпретатор Python не поддерживается Функции Azure рабочей роли Python
Диагностика ошибки ссылки "cygrpc"
Существует несколько возможных причин ошибок, которые ссылаются cygrpc
на них, которые подробно описаны в этом разделе.
Интерпретатор Python не соответствует архитектуре ОС.
Это несоответствие, скорее всего, вызвано 32-разрядным интерпретатором Python, установленным в 64-разрядной операционной системе.
Если вы работаете в операционной системе x64, убедитесь, что 64-разрядная версия Python версии 3.6, 3.7, 3.8 или 3.9 также находится в 64-разрядной версии.
Вы можете проверить бит интерпретатора Python, выполнив следующие команды:
В Windows в PowerShell выполните команду py -c 'import platform; print(platform.architecture()[0])'
.
В оболочке, аналогичной Unix, выполните команду python3 -c 'import platform; print(platform.architecture()[0])'
.
Если между битами интерпретатора Python и архитектурой операционной системы существует несоответствие, скачайте соответствующий интерпретатор Python из Python Software Foundation.
Интерпретатор Python не поддерживается Функции Azure рабочей роли Python
Рабочая роль Python Функции Azure поддерживает только определенные версии Python.
Проверьте, соответствует ли интерпретатор Python ожидаемой версии py --version
в Windows или python3 --version
в таких системах, как Unix. Убедитесь, что результат возврата является одним из поддерживаемых версий Python.
Если версия интерпретатора Python не соответствует требованиям для Функции Azure, вместо этого скачайте версию интерпретатора Python, поддерживаемую функциями из Python Software Foundation.
Устранение неполадок: python завершился с кодом 137
Ошибки с кодом 137 обычно вызваны проблемами нехватки памяти в вашем приложении-функции Python. В результате отображается следующее сообщение об ошибке Функций Azure:
Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitExitException: python вышел из кода 137
Эта ошибка возникает, когда приложение-функция Python вынуждено завершить работу операционной системой с сигналом SIGKILL
. Этот сигнал обычно указывает на ошибку нехватки памяти в вашем процессе Python. Платформа Функции Azure имеет ограничение службы, которое завершает любые приложения-функции, превышающие это ограничение.
Чтобы проанализировать узкие места памяти в приложении-функции, см. раздел "Профиль приложения-функции Python" в локальной среде разработки.
Устранение неполадок: python завершился с кодом 139
Инструкции из этого раздела помогут вам устранить ошибки сегментации в приложении-функции Python. Эти ошибки обычно приводят к появлению следующих сообщений об ошибках в Функциях Azure.
Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitExitException: python вышел из кода 139
Эта ошибка возникает, когда приложение-функция Python вынуждено завершить работу операционной системой с сигналом SIGSEGV
. Этот сигнал указывает на нарушение сегментации памяти, что может привести к неожиданному чтению или записи в область ограниченной памяти. В следующих разделах мы предоставили список наиболее вероятных первопричин.
Регрессия из пакетов сторонних поставщиков
В requirements.txt файле приложения-функции незакреченный пакет обновляется до последней версии во время каждого развертывания в Azure. Обновления пакетов могут привести к регрессии, которые влияют на ваше приложение. Чтобы восстановиться после таких проблем, закомментируйте инструкции импорта, отключите ссылки на пакет или закрепите пакет до предыдущей версии в requirements.txt.
Извлечение данных из PKL-файла неправильного формата
Если приложение-функция использует библиотеку выбора Python для загрузки объекта Python из PKL-файла , возможно, файл содержит неправильно сформированную строку байтов или недопустимую ссылку на адрес. Чтобы восстановить эту проблему, попробуйте закомментировать функцию pickle.load()
.
Конфликт подключений Pyodbc
Если приложение-функция использует популярный драйвер базы данных ODBC pyodbc, возможно, что несколько подключений открыты в одном приложении-функции. Чтобы избежать этой проблемы, используйте шаблон singleton и убедитесь, что в приложении-функции используется только одно подключение pyodbc.
Сбой триггеров синхронизации
Sync triggers failed
Ошибка может быть вызвана несколькими проблемами. Одна из возможных причин — конфликт между определяемыми клиентом зависимостями и встроенными модулями Python при выполнении функций в плане Служба приложений. Дополнительные сведения см. в разделе "Управление пакетами".
Устранение неполадок: не удалось загрузить файл или сборку
Эта ошибка отображается при локальном запуске с помощью модели программирования версии 2. Эта ошибка вызвана известной проблемой, которую необходимо устранить в предстоящем выпуске.
Это пример сообщения для этой ошибки:
DurableTask.Netherite.AzureFunctions: не удалось загрузить файл или сборку Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289.
Системе не удается найти указанный файл.
Ошибка возникает из-за проблемы с кэшем пакета расширений. Чтобы устранить проблему, выполните следующую команду, --verbose
чтобы просмотреть дополнительные сведения:
func host start --verbose
Скорее всего, вы видите эту проблему кэширования, когда вы увидите журнал загрузки расширения, как Loading startup extension <>
это не следует Loaded extension <>
.
Для разрешения этой проблемы:
Найдите путь, выполнив следующую
.azure-functions-core-tools
команду:func GetExtensionBundlePath
Удалите каталог
.azure-functions-core-tools
.rm -r <insert path>/.azure-functions-core-tools
Каталог кэша повторно создается при повторном запуске основных инструментов.
Устранение неполадок: не удается устранить подключение служба хранилища Azure
Эта ошибка может появиться в локальном выходных данных в следующем сообщении:
Microsoft.Azure.WebJobs.Extensions.DurableTask: не удается разрешить подключение служба хранилища Azure с именем Storage.
значение не может быть равно NULL. (Параметр "provider")
Эта ошибка приводит к тому, как расширения загружаются из пакета локально. Чтобы устранить эту ошибку, выполните одно из следующих действий:
Используйте эмулятор хранения, например Azurite. Этот вариант является хорошим, если вы не планируете использовать учетную запись хранения в приложении-функции.
Создайте учетную запись хранения и добавьте строка подключения в
AzureWebJobsStorage
переменную среды в файле localsettings.json. Используйте этот параметр, если вы используете триггер учетной записи хранения или привязку с приложением, или если у вас есть существующая учетная запись хранения. Чтобы приступить к работе, создайте такую учетную запись.
Функции, которые не найдены после развертывания
Существует несколько распространенных проблем сборки, которые могут привести к тому, что функции Python не будут найдены узлом после, по-видимому, успешного развертывания:
Пул агентов должен работать в Ubuntu, чтобы гарантировать правильность восстановления пакетов на этапе сборки. Убедитесь, что шаблон развертывания требует среды Ubuntu для сборки и развертывания.
Если приложение-функция не находится в корне исходного репозитория, убедитесь, что
pip install
шаг ссылается на правильное расположение, в котором создается.python_packages
папка. Помните, что это расположение учитывает регистр, например в этом примере команды:pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
Шаблон должен создать пакет развертывания, в который можно загрузить
/home/site/wwwroot
. В Azure Pipelines это делается задачейArchiveFiles
.
Проблемы разработки в портал Azure
При использовании портал Azure учитывайте эти известные проблемы и их обходные пути.
- На портале существуют общие ограничения для написания кода функции. Дополнительные сведения см. в разделе об ограничениях разработки в портал Azure.
- Чтобы удалить функцию из приложения-функции на портале, удалите код функции из самого файла. Кнопка "Удалить " не работает, чтобы удалить функцию при использовании модели программирования Python версии 2.
- При создании функции на портале может быть наставлено использовать другое средство для разработки. Существует несколько сценариев, в которых невозможно изменить код на портале, в том числе при обнаружении синтаксической ошибки. В этих сценариях используйте Visual Studio Code или Функции Azure Core Tools для разработки и публикации кода функции.
Следующие шаги
Если устранить проблему не удается, обратитесь к команде Функции Azure: