Как импортировать класс Python, который находится в каталоге выше?

Я хочу наследовать от класса в файле, который находится в каталоге выше текущего.

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

Ответ 1

Внутри иерархии пакетов используйте две точки, как import statement doc говорит:

При указании модуля для импорта вам не нужно указывать абсолютное имя модуля. Когда модуль или пакет содержатся в другом пакете, можно сделать относительный импорт в одном верхнем пакете без упоминания имени пакета. Используя ведущие точки в указанном модуле или пакете после from, вы можете указать, как высоко пройти по текущей иерархии пакетов без указания точных имен. Одна ведущая точка означает текущий пакет, в котором существует модуль, создающий импорт. Два точки означают один уровень пакета. Три точки расположены на двух уровнях и т.д. Поэтому, если вы выполните from . import mod из модуля в пакете pkg, вы в конечном итоге импортируете pkg.mod. Если вы выполните from ..subpkg2 import mod из pkg.subpkg1, вы импортируете pkg.subpkg2.mod. Спецификация относительного импорта содержится в PEP 328.

PEP 328 использует абсолютный/относительный импорт.

Ответ 2

@gimel ответ правильный, если вы можете гарантировать иерархию пакетов, которую он упоминает. Если вы не можете - если ваша настоящая потребность в том, что вы выразили это, исключительно привязанные к каталогам и без каких-либо необходимых отношений с упаковкой, - тогда вам нужно работать с __file__, чтобы узнать родительский каталог (пара os.path.dirname вызовы будут выполняться;-), тогда (если этот каталог еще не находится на sys.path) preend временно вставляет указанный каталог в самом начале sys.path, __import__, снова удаляет указанный каталог - беспорядочная работа действительно, но "когда вам нужно, вы должны" (и Pyhon стремится никогда не останавливать программиста от того, что делать должен), как и в стандарте ISO C, говорится в разделе "Дух C" в его предисловие! -).

Вот пример, который может сработать для вас:

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

import module_in_parent_dir

Ответ 3

import sys
sys.path.append("..") # Adds higher directory to python modules path.

Ответ 4

from .. import module # Import module from a higher directory.

Ответ 5

Я считаю, что когда ваш код полностью автономно в модуле, вы всегда можете ссылаться на этот модуль как на пространство имен верхнего уровня.

foo/
  __init__.py
  bar/
    __init__.py
  baz/
    __init__.py

.

foo/baz/__init__.py
#!/usr/bin/env python2

import foo
# or
from foo import bar