11

Импорт модулей из родительской папки

13

Я использую Python 2.5.

Вот структура папок моего проекта:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(У меня также есть __init__.py в каждой папке, который я не указываю здесь для удобства чтения).

Как мне импортировать модуль nib из модуля life? Я надеюсь, что это можно сделать без изменения sys.path.

Замечание: Главный модуль, который я выполняю, находится в папке ptdraft.

5 ответ(ов)

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, чтобы получить имя файла и путь текущего файла.

1

Похоже, что проблема не связана с тем, что модуль находится в родительском каталоге или чем-то подобным.

Вам необходимо добавить каталог, в котором находится ptdraft, в переменную окружения PYTHONPATH.

Вы упомянули, что import nib работал у вас, что, вероятно, означает, что вы добавили именно ptdraft (а не его родительский каталог) в PYTHONPATH.

0

Библиотека pathlib (включена в Python начиная с версии 3.4) позволяет очень лаконично и интуитивно добавлять путь к родительскому каталогу в переменную PYTHONPATH:

import sys
from pathlib import Path
sys.path.append(str(Path(__file__).absolute().parent))

Этот подход использует Path для получения абсолютного пути к текущему файлу (__file__) и затем добавляет путь к его родительскому каталогу в sys.path, что позволяет импортировать модули из этого каталога.

0

Вот более универсальное решение, которое добавляет родительскую директорию в sys.path (у меня оно работает):

import os.path
import sys

sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))

Это позволит вам импортировать модули из родительской директории.

0

Чтобы импортировать пакет из родительского каталога скрипта, вы можете использовать следующий подход. В вашем примере вы хотите импортировать функции из 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. Не забудьте заменить ваш_файл на конкретный файл, который вы хотите импортировать.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь