Как импортировать папку приложения FastAPI, чтобы удовлетворить запросы pycharm и pylint?

#python #pycharm #python-import #fastapi #pylint

Вопрос:

Я пытаюсь найти лучший способ управления относительным и абсолютным импортом в моем проекте, чтобы инструменты тестирования и компоновки из pylint, pytest, vscode и pycharm были довольны и чтобы приложение работало правильно в производстве.

Я не упаковал приложение, setup.py потому что оно установлено в образ docker и запускается из его рабочего каталога. Моя структура каталогов проекта выглядит следующим образом:

 app
 ┣ app
 ┃ ┣ static
 ┃ ┃ ┗ myfrontend.js
 ┃ ┣ templates
 ┃ ┃ ┗ index.html
 ┃ ┣ tests
 ┃ ┃ ┣ __init__.py
 ┃ ┃ ┗ test_server.py
 ┃ ┣ __init__.py
 ┃ ┣ main.py
 ┃ ┗ utils.py
 ┣ Dockerfile
 ┗ requirements.txt
 

В app/app/main.py импорте являются:

 from app.utils import prepare_file

app = FastAPI()
 

а в app/app/tests/test_server.py импорте есть:

 from app.main import app
from app.utils import prepare_file
 

И все это запускается из образа докера, созданного на основе tiangolo/uvicorn-gunicorn-fastapi, путем копирования файлов и установки рабочего кода:

 COPY ./app/app /app/app/
WORKDIR /app
 

Это работает с компоновкой и тестированием VSCode, а также с набором инструментов контроля качества:

 pylint -E app/app # processes with no errors
pytest app/app/tests # correctly runs tests
docker build . -f app/Dockerfile -t myapp amp;amp; docker container run myapp # app runs
 

Однако PyCharm задыхается от импорта:

 Unresolved reference 'app'
Cannot find reference 'main' in 'imported module app'
Cannot find reference 'utils' in 'imported module app'
 

Проект PyCharm имеет два подмодуля (библиотека с основной «бизнес-логикой» и веб-приложение, которое ее обертывает).

Pycharm можно сделать счастливым, изменив app/app/main.py на:

 from ..app.utils import prepare_file
 

и app/app/tests/test_server.py чтобы:

 from ...app.main import app
from ...app.utils import prepare_file
 

но это запускает pylint:

 $ pylint -E app/app
************* Module app.main
app/app/main.py:18:0: E0402: Attempted relative import beyond top-level package (relative-beyond-top-level)
************* Module app.tests.test_server
app/app/tests/test_server.py:2:0: E0402: Attempted relative import beyond top-level package (relative-beyond-top-level)
app/app/tests/test_server.py:3:0: E0402: Attempted relative import beyond top-level package (relative-beyond-top-level)
 

Я могу придумать два возможных объяснения:

  1. В PyCharm где-то спрятан переключатель, который нужно щелкнуть, чтобы сделать его совместимым. Я попытался пометить app/app как «корневой источник», но это не помогло.
  2. Весь подход нарушает правильную структуру веб-приложения python, и все это должно быть реструктурировано.

А ты как думаешь? Это проблема совместимости PyCharm? Или проблема с квадратным колышком вокруг всего дизайна?

Комментарии:

1. Открываете ли вы с помощью pycharm самую верхнюю app папку из двух? Например, если я открою с помощью VS-кода вторую app или другую верхнюю папку, она также сообщит мне об ошибке

2. Попробуйте сначала установить app в качестве «корневого источника» в PyCharm

Ответ №1:

Решение: Отметьте app как «корневой источник» не app/app . Затем pycharm видит то, что видят другие линтеры.

Спасибо @lsabi и @mx0 за указатели.