У меня есть монорепозиторий с проектом 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.
Установите 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'.