Импорт модулей из родительской папки
Я использую 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?
Как сослаться на пакет Python, если в имени файла есть точка?
Как решить проблему "ImportError: Невозможно импортировать имя X" или "AttributeError: ... (вероятно, из-за циклического импорта)"?
Подключение файла из подпапки?