Импорт из одноуровневого каталога - PullRequest
32 голосов
/ 28 декабря 2010

У меня есть класс Python под названием "ClassA" и другой класс Python, который должен импортировать ClassA, который называется "ClassB".Структура каталогов следующая:

MainDir
../Dir
..../DirA/ClassA
..../DirB/ClassB

Как бы я использовал sys.path, чтобы ClassB мог использовать ClassA?

Ответы [ 3 ]

47 голосов
/ 21 марта 2012

в качестве буквального ответа на вопрос ' Python Import from parent directory ':

для импорта 'mymodule', который находится в родительском каталоге вашего текущего модуля:

import os
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.sys.path.insert(0,parentdir) 
import mymodule

редактировать К сожалению, атрибут __file__ не всегда установлен. Более безопасный способ получить parentdir - через модуль inspect:

import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
24 голосов
/ 28 декабря 2010

Вы можете использовать относительный импорт (пример по ссылке, текущий модуль - A.B.C):

from . import D                 # Imports A.B.D
from .. import E                # Imports A.E
from ..F import G               # Imports A.F.G
17 голосов
/ 28 декабря 2010

Вы действительно должны использовать пакеты. Затем MainDir помещается в точку в файловой системе на sys.path (например, ... / site-packages), тогда вы можете сказать в ClassB:

from MainDir.Dir.DirA import ClassA # which is actually a module

Вам просто нужно поместить файлы с именем __init__.py в каждый каталог, чтобы сделать его иерархией пакетов.

...