Развертывание приложения-функции Python, источник которого находится в подкаталоге

У меня есть монорепозиторий с проектом Python, который я развертываю в Azure. API развертывается как контейнер, и я пытаюсь добавить приложение-функцию.

Мой код Python структурирован в несколько папок в папке /backend, например

./backend
./backend/domain/ - contains domain logic .py files
./backend/entrypoints/api - contains Flask app files
./backend/entrypoints/my-func - contains my new function app
./backend/... - various other folder hierarchies that are imported.

У меня есть настроенный venv и файл require.txt в корне проекта.

Приложение-функция импортирует domain и другие модули. Все папки имеют значок __init__.py, обозначающий их как модули.

Я изо всех сил пытаюсь запустить проект. Если я func start в каталоге ./backend/entrypoints/my-func, я получаю ModuleNotFoundError:

Exception: ModuleNotFoundError: No module named 'dotenv'. Cannot find module. Please check the requirements.txt file for the missing module. 

Мое приложение flask прекрасно загружается dotenv, оно находится в файле требований.txt и установлено.

$ pip install -r requirements.txt
... 
Requirement already satisfied: python-dotenv~=1.0.1 in /home/greg/.pyenv/versions/3.12.2/envs/fish12-2/lib/python3.12/site-packages (from -r requirements.txt (line 27)) (1.0.1)
...

Возможно ли это?

🤔 А знаете ли вы, что...
Python имеет множество фреймворков для веб-разработки, такие как Django и Flask.


60
1

Ответ:

Решено

Установите PYTHONPATH, чтобы гарантировать, что Python находит каталоги, содержащие модули, а также позволяет вам контролировать, какие каталоги могут быть включены в путь поиска модулей.

Например: set PYTHONPATH=../../../

Я выполнил следующие шаги, чтобы использовать модули в подкаталоге проекта.

Структура проекта:

Monorepo
|
|---requirements.txt
\---env
|
+---backend
|   \---entrypoint
|       +---api
|       |       app.py
|       |
|       \---my-func
|           |   .gitignore
|           |   function_app.py
|           |   host.json
|           |   local.settings.json
|           |
|           +---.vscode
|           |       extensions.json
|           |
|           \---__pycache__
|                   function_app.cpython-311.pyc

требования.txt

azure-functions
flask
python-dotenv

Создайте и активируйте виртуальную среду в корневом каталоге:

py -m venv env
.\env\Scripts\activate

Установите пакеты в виртуальную среду:

pip install -r requirements.txt

Перейдите в папку функции и выполните команду:

(env) C:\Users\uname\monorepo\backend\entrypoint\my-func>set PYTHONPATH=../../../

Возможность запуска функции с модулем dotenv:

фрагмент кода:

import azure.functions as func
import datetime
import json
import logging
from dotenv import load_dotenv

app = func.FunctionApp()

@app.route(route = "http_trigger", auth_level=func.AuthLevel.ANONYMOUS)
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

Ответ:

(env) C:\Users\uname\monorepo\backend\entrypoint\my-func>func start
Found Python version 3.11.9 (py).

Azure Functions Core Tools
Core Tools Version:       4.0.5907 Commit hash: N/A +807e89766a92b1XXX8777ab209 (64-bit)
Function Runtime Version: 4.834.3.22875

[2024-08-30T07:39:25.263Z] Worker process started and initialized.

Functions:

        http_trigger:  http://localhost:7071/api/http_trigger

For detailed output, run func with --verbose flag.
[2024-08-30T07:39:30.124Z] Executing 'Functions.http_trigger' (Reason='This function was programmatically called via the host APIs.', Id=bc1ffc1c-089b-47f4-XX3108)
[2024-08-30T07:39:30.228Z] Python HTTP trigger function processed a request.
[2024-08-30T07:39:30.362Z] Executed 'Functions.http_trigger' (Succeeded, Id=bc1ffc1c-089b-47f4-992XXX08, Duration=252ms)
[2024-08-30T07:39:30.384Z] Host lock lease acquired by instance ID '000000000000000000000000F72731CC'.