Как импортировать модуль из родительского каталога без sys.path? - PullRequest
2 голосов
/ 27 сентября 2019

Я пытаюсь вызвать модуль из родительского пакета.

Структура моего проекта -

be/
  __init__.py
  api/
    __init__.py
    models.py
  alembic/
    env.py

Как вызвать models.py внутри env.py

Я попытался, как показано ниже,

from api.models import Base

Я получаю сообщение об ошибке - ImportError: No module named 'api'

Я думал о реструктуризации, поместив каталог alembic в каталог api, все еще не в состоянии импортироватьmodels.

Использование sys.path выглядит глупо, если мне нужно изменить структуру проекта, предложите.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Некоторые предложения:

1.) Просто примите его и измените sys.path; -)

2.) Убедитесь, что переменная окружения PYTHONPATH указывает на родительский каталог (be) ивызовите ваш скрипт только тогда

Пример:

export PYTHONPATH=/absolute/path/to/be

3.) добавьте файл __init__.py в каталог alembic и вызовите ваш скрипт из директории be с помощью.python -m alembic.env

4.) добавить __init__.py как для 3.) и небольшой скрипт-обертку в каталог be и вызвать этот скрипт из be, этот скрипт затем импортирует alembic.env и назовите его «основной» функцией.

Не стесняйтесь обращаться ко мне, если мои предложения недостаточно ясны.

Я не знаю вашего контекста, но часто предпочитаю 3.) и 4.) поскольку никто не должен знать об переменных среды или изменениях пути sys.

1 голос
/ 27 сентября 2019

Вы можете использовать относительный импорт

внутри env.py, вам нужно только from ..api.models import Base

Если вы не хотите использовать относительный импорт, вы также можете попробовать абсолютный импорт, например

from be.api.models import Base

при условии, что вы экспортировали PYTHONPATH в be на

path_to_be=''
export PYTHONPATH=$path_to_be:$PATH
...