Как импортировать класс 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