Импорт модулей из родительской папки
Я использую Python 2.5.
Вот структура папок моего проекта:
ptdraft/
nib.py
simulations/
life/
life.py
(У меня также есть __init__.py
в каждой папке, который я не указываю здесь для удобства чтения).
Как мне импортировать модуль nib
из модуля life
? Я надеюсь, что это можно сделать без изменения sys.path
.
Замечание: Главный модуль, который я выполняю, находится в папке ptdraft
.
5 ответ(ов)
Отвечая на ваш вопрос, стоит отметить, что относительные импорты (например, from .. import mymodule
) работают только в рамках пакета. Если вам нужно импортировать mymodule
, который находится в родительском каталоге вашего текущего модуля, вы можете использовать следующий код:
import os
import sys
import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0, parentdir)
import mymodule
Обратите внимание, что атрибут __file__
не всегда доступен. Вместо использования os.path.abspath(__file__)
, я рекомендую использовать модуль inspect
, чтобы получить имя файла и путь текущего файла.
Похоже, что проблема не связана с тем, что модуль находится в родительском каталоге или чем-то подобным.
Вам необходимо добавить каталог, в котором находится ptdraft
, в переменную окружения PYTHONPATH.
Вы упомянули, что import nib
работал у вас, что, вероятно, означает, что вы добавили именно ptdraft
(а не его родительский каталог) в PYTHONPATH.
Библиотека pathlib
(включена в Python начиная с версии 3.4) позволяет очень лаконично и интуитивно добавлять путь к родительскому каталогу в переменную PYTHONPATH
:
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).absolute().parent))
Этот подход использует Path
для получения абсолютного пути к текущему файлу (__file__
) и затем добавляет путь к его родительскому каталогу в sys.path
, что позволяет импортировать модули из этого каталога.
Вот более универсальное решение, которое добавляет родительскую директорию в sys.path (у меня оно работает):
import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
Это позволит вам импортировать модули из родительской директории.
Чтобы импортировать пакет из родительского каталога скрипта, вы можете использовать следующий подход. В вашем примере вы хотите импортировать функции из env.py
, находящегося в директории alembic
, в пакет app.db
.
Вот как это можно сделать:
import os
import sys
# Получаем текущий каталог
currentdir = os.path.dirname(os.path.realpath(__file__))
# Получаем родительский каталог
parentdir = os.path.dirname(currentdir)
# Добавляем родительский каталог в sys.path
sys.path.append(parentdir)
С помощью этого кода вы добавляете родительскую директорию в путь поиска модулей Python, что позволяет вам импортировать модули из app
в env.py
. Теперь вы можете сделать импорт следующим образом:
from app.db import ваш_файл
Таким образом, вы сможете использовать функции и классы из app.db
в env.py
. Не забудьте заменить ваш_файл
на конкретный файл, который вы хотите импортировать.
Как создать каталог и все отсутствующие родительские каталоги?
Как разгрузить (перезагрузить) модуль Python?
Как получить полный путь к директории текущего файла?
Функциональность mkdir -p в Python
Получение списка всех подпапок в текущем каталоге