#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)
Я могу придумать два возможных объяснения:
- В PyCharm где-то спрятан переключатель, который нужно щелкнуть, чтобы сделать его совместимым. Я попытался пометить
app/app
как «корневой источник», но это не помогло. - Весь подход нарушает правильную структуру веб-приложения python, и все это должно быть реструктурировано.
А ты как думаешь? Это проблема совместимости PyCharm? Или проблема с квадратным колышком вокруг всего дизайна?
Комментарии:
1. Открываете ли вы с помощью pycharm самую верхнюю
app
папку из двух? Например, если я открою с помощью VS-кода вторуюapp
или другую верхнюю папку, она также сообщит мне об ошибке2. Попробуйте сначала установить
app
в качестве «корневого источника» в PyCharm
Ответ №1:
Решение: Отметьте app
как «корневой источник» не app/app
. Затем pycharm видит то, что видят другие линтеры.
Спасибо @lsabi и @mx0 за указатели.