ModuleNotFoundError в приложении Python AzureFunction для пользовательского пакета

Я разрабатываю приложение PythonAzure Function и использую Custom Package для этого проекта. из-за специального пакета я собираю и устанавливаю все зависимости в своем CI/CD конвейере, прежде чем создавать zip файл и развертывать его в Azure на основе этой документации. Моя проблема в том, что когда приложение успешно развернулось, я получил сообщение об ошибке Custom Package не найден при запуске приложения. Полное сообщение об ошибке:

Результат: Исключение сбоя: ModuleNotFoundError: нет модуля с именем «{имя пользовательского пакета}». Не могу найти модуль. Пожалуйста, проверьте файл требований.txt на наличие отсутствующего модуля.

Я проверяю эту документацию и дважды проверяю свой артефакт. единственное, что я нашел на основе документации, формат имени пакета должен быть «<package-name>-<version>-dist-info», но в моем артефакте — «<package-name>-<version>.dist-info».

Кроме того, я пробую эти конфигурации в Azure Function, но это не имеет значения.

Конфигурации:

  • BUILD_FLAGS=ИспользоватьExpressBuild

  • PYTHON_ISOLATE_WORKER_DEPENDENCIES=0

  • SCM_DO_BUILD_DURING_DEPLOYMENT=истина

  • ENABLE_ORYX_BUILD=истина

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
118
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

ModuleNotFoundError: нет модуля с именем «{имя пользовательского пакета}». Не могу найти модуль.

Ошибка ModuleNotFoundError возникает, когда ваш пакет не указан в requirements.txt вашего приложения-функции. Если вы хотите установить пакет отдельно, вам придется отдельно добавить команду apt-get package-name или команду pip install package-name в раздел команд запуска задачи Azure Function DevOps.

Команда запуска в yaml: -

          - task: AzureFunctionApp@1
            displayName: 'Azure functions app deploy'
            inputs:
              azureSubscription: 'xxxxxx (xxxxxx)'
              appType: 'functionAppLinux'
              appName: 'siliconfuncv2'
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
              startUpCommand: 'apt-get update apt-get install libgstreamer1.0-0 libunwind-dev gstreamer1.0-pulseaudio'

Есть two ways you can install Custom packages in your Linux Function app.

См. мой SO ответ 1, где я добавил пользовательские пакеты в папку исходного кода, а затем добавил имя папки в качестве пути в requirements.txt во время развертывания веб-приложения пакеты внутри папки добавляются автоматически. Вы можете использовать ту же концепцию для развертывания пользовательского пакета в вашем приложении-функции.

См. SO ответ 2, где вы можете загрузить свои собственные пакеты в Github, а затем использовать этот git+https://[email protected]/sid24desai/pycode.git@main URL-адрес с вашим токеном PAT Github/githuborg/repository/ в файле require.txt, как показано ниже: -

Это мой requirements.txt:-

azure-functions
git+https://[email protected]/sid24desai/pycode.git@main

Мой конвейер Yaml Azure Devops: -

trigger:
- master

variables:
 
  azureSubscription: 'xxxxxxxx97cb2a7'

  
  functionAppName: 'siliconfunc65'

  
  vmImageName: 'ubuntu-latest'

  
  workingDirectory: '$(System.DefaultWorkingDirectory)'

stages:
- stage: Build
  displayName: Build stage

  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)

    steps:
    - bash: |
        if [ -f extensions.csproj ]
        then
            dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin
        fi
      workingDirectory: $(workingDirectory)
      displayName: 'Build extensions'

    - task: UsePythonVersion@0
      displayName: 'Use Python 3.6'
      inputs:
        versionSpec: 3.10 

    - bash: |
        pip install --target = "./.python_packages/lib/site-packages" -r ./requirements.txt
      workingDirectory: $(workingDirectory)
      displayName: 'Install application dependencies'

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(workingDirectory)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      artifact: drop

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  condition: succeeded()

  jobs:
  - deployment: Deploy
    displayName: Deploy
    environment: 'development'
    pool:
      vmImage: $(vmImageName)

    strategy:
      runOnce:
        deploy:

          steps:
          - task: AzureFunctionApp@1
            displayName: 'Azure functions app deploy'
            inputs:
              azureSubscription: 'xxxxx subscription (xxxxxxxb2a7)'
              appType: 'functionAppLinux'
              appName: '$(functionAppName)'
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'

Дополнительная ссылка: -

Развертывание функций Azure с использованием конвейера CI-CD, отличающееся от развертывания VsCode – 1 Ответ Мой ответ SO

Ответ принят как подходящий

ModuleNotFoundError обычно возникает, когда необходимый пакет Python неправильно установлен в каталог «.python_packages/lib/site-packages». Этот каталог следует заархивировать вместе с файлами приложения-функции Python, чтобы создать ZIP-архив, который будет развернут в приложении-функции Azure.

В вашем случае, поскольку пакет Python является вашим пользовательским пакетом, рекомендуется опубликовать его в канале артефактов вашего проекта Azure DevOps для использования:

  1. Создайте частный канал артефактов в своем проекте Azure DevOps, если у вас его нет. И убедитесь, что вы добавили PyPI в качестве восходящего канала в канале.

  2. Создайте и опубликуйте свой собственный пакет Python в ленте. Вы можете настроить конвейер для этого для вашего пакета.

  3. В конвейере для развертывания приложения-функции Python перед задачей, которая запускает команду «pip install», добавьте задачу Python pip аутентификации, как показано ниже.

    steps:
    . . .
    
    - task: PipAuthenticate@1
      displayName: 'Pip Authenticate'
      inputs:
        artifactFeeds: {Your Artifacts feed name}
    
    . . .
    
  4. Убедитесь, что вы указали пользовательский пакет в файле requirements.txt вашего приложения-функции Python. И в коде вашего приложения-функции Python убедитесь, что вы правильно установили import пользовательский пакет.

  5. При запуске следующей команды «pip install» в корневом каталоге вашего приложения-функции Python будет установлен ваш пользовательский пакет из канала «Артефакты», а общедоступные пакеты из восходящего потока PyPI в каталог «.python_packages/lib/site-packages».

    pip install --target = "./.python_packages/lib/site-packages" -r ./requirements.txt
    
  6. Затем вы можете использовать задачу Архивировать файлы, чтобы заархивировать каталог «.python_packages/lib/site-packages» вместе с файлами вашего приложения-функции Python в ZIP-архив.


Другие вопросы по теме