Я хочу наследовать от класса в файле, который находится в каталоге выше текущего.
Возможно ли относительно импортировать этот файл?
Я хочу наследовать от класса в файле, который находится в каталоге выше текущего.
Возможно ли относительно импортировать этот файл?
Внутри иерархии пакетов используйте две точки, как import statement doc говорит:
При указании модуля для импорта вам не нужно указывать абсолютное имя модуля. Когда модуль или пакет содержатся в другом пакете, можно сделать относительный импорт в одном верхнем пакете без упоминания имени пакета. Используя ведущие точки в указанном модуле или пакете после
from
, вы можете указать, как высоко пройти по текущей иерархии пакетов без указания точных имен. Одна ведущая точка означает текущий пакет, в котором существует модуль, создающий импорт. Два точки означают один уровень пакета. Три точки расположены на двух уровнях и т.д. Поэтому, если вы выполнитеfrom . import mod
из модуля в пакетеpkg
, вы в конечном итоге импортируетеpkg.mod
. Если вы выполнитеfrom ..subpkg2 import mod
изpkg.subpkg1
, вы импортируетеpkg.subpkg2.mod
. Спецификация относительного импорта содержится в PEP 328.
PEP 328 использует абсолютный/относительный импорт.
@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
import sys
sys.path.append("..") # Adds higher directory to python modules path.
from .. import module # Import module from a higher directory.
Я считаю, что когда ваш код полностью автономно в модуле, вы всегда можете ссылаться на этот модуль как на пространство имен верхнего уровня.
foo/
__init__.py
bar/
__init__.py
baz/
__init__.py
.
foo/baz/__init__.py
#!/usr/bin/env python2
import foo
# or
from foo import bar