Импорт файлов из одноуровневой директории - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужно запустить модульные тесты для моего приложения Flask.В моем тестовом конфигурационном файле мне нужно импортировать функцию flask create_app из одноуровневой директории для инициализации тестового приложения.Я не могу понять это без ошибок импорта.

Я попытался поместить __init__.py практически в каждую папку, но безуспешно.Я прочитал, что редактирование пути sys не рекомендуется, поэтому я хотел бы найти решение без.

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

root/
----__init__.py
----server/
--------__init__.py
--------database.py
----tests/
--------__init__.py
--------config.py

config.py

from server import create_app
from server.database import db

Вызывает эту ошибку:

Traceback (most recent call last):
  File "tests/config.py", line 2, in <module>
    from server import create_app
ModuleNotFoundError: No module named 'server'

и:

from ..server import create_app
from ..server.database import db

Вызывает эту ошибку:

Traceback (most recent call last):
  File "tests/config.py", line 2, in <module>
    from ..server import create_app
ValueError: attempted relative import beyond top-level package

Может кто-нибудь объяснитьпочему это не работает и как работает python import s в целом?Я никогда не мог понять их.

1 Ответ

0 голосов
/ 08 февраля 2019

Чтобы оператор импорта работал правильно, имена должны быть каким-то образом разрешены в sys.path.Создание правильной структуры пакета и установка пакета, как правило, - лучший способ получить имена, видимые в sys.path.

  1. Удалить root/__init__.py и tests/__init__.py
  2. Исправить импортзаявления:
from ..server import create_app  # no
from server import create_app  # yes
Добавить root/setup.py с содержимым, как описано в Основное руководство по setuptools . Создать / активировать virtualenv (обычно в root/.venv/ subdir, но на самом деле не имеет значения, где) Из корневого каталога проекта, т. Е. Каталога, содержащего setup.py, установите пакет:
pip install --editable .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...