2010-12-27 2 views
28

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

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

Как бы использовать sys.path так, что ClassB можно использовать CLASSA?

+2

Это называется относительный импорт и имеет совсем немного googleable материала и SO вопросы. – delnan

+0

http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder – jgritty

ответ

16

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

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

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

+0

Я добавил MainDir в sys.path и попробовал ваше решение, но он просто говорит, что нет модуля с именем MainDir.Dir.DirA, и есть __init __. pys во всех каталогах. – skylerl

+3

Не добавляйте MainDir, добавьте его родительский каталог. Если вы добавите MainDir (если это не корневой каталог пакета, это нормально), вместо этого импортируйте как «из Dir.DirA import ClassA'. – Keith

21

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

from . import D     # Imports A.B.D 
from .. import E    # Imports A.E 
from ..F import G    # Imports A.F.G 
+5

Не работает ли это только в том случае, если они находятся в пакете? – skylerl

+4

@Yakattak: Да, но они все равно должны быть в пакете;) – delnan

+0

это выглядит как самый лучший и самый простой ответ –

44

как буквальный ответ на вопрос «Python Импорт из родительского каталога»:

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

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

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

import inspect 
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
parentdir = os.path.dirname(currentdir) 
+0

Это помогло мне. – odigity

+0

Реми - Спасибо за буквальный ответ. Я нашел это полезным при написании тестового кода для приложения python. Я могу поместить тестовый код в подкаталог, и я могу начать сдавать тесты без изменения существующего проекта. (Другими словами, преобразование существующего кода в модуль перед проведением тестов было бы неправильным порядком делать вещи с точки зрения управления риском введения ошибок в рабочий код.) Ваш метод изменения пути к модулю удобен. –

+0

Это единственное, что просто работает, спасибо! –

Смежные вопросы