2010-12-27 14 views
28

Mam klasę Python o nazwie "ClassA" i inną klasę Python, która ma zaimportować ClassA, która jest "ClassB". Struktura katalogu jest następujący:Import z katalogu rodzeństwa

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

Jak użyłbym sys.path tak że ClassB można używać ClassA?

+2

Nazywa importu względne i ma sporo materiału googleable a więc pytania. – delnan

+0

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

Odpowiedz

16

Naprawdę należy za pomocą pakietów. Następnie MainDir jest umieszczony w punkcie w systemie plików na sys.path (np .../site-packages), można powiedzieć, w ClassB:

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

Trzeba tylko umieścić pliki o nazwie __init__.py w każdym katalog, aby uczynić go hierarchią pakietów.

+0

Dodałem MainDir do sys.path i wypróbowałem twoje rozwiązanie, ale po prostu mówi, że nie ma modułu o nazwie MainDir.Dir.DirA, a są __init __. pys we wszystkich katalogach. – skylerl

+3

Nie dodawaj katalogu MainDir, dodaj jego katalogu nadrzędnego. Jeśli dodasz MainDir (jeśli nie jest to root pakietu, to jest w porządku), zaimportuj jak 'from Dir.DirA import ClassA'. – Keith

21

Można użyć relative import (przykład z linku, prąd moduł - 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

Czy to nie działa tylko wtedy, gdy są w pakiecie? – skylerl

+4

@Yakattak: Tak, ale i tak powinny być w paczce;) – delnan

+0

to wygląda na najlepszą i najprostszą odpowiedź: –

44

jako dosłowne odpowiedzi na pytanie „Python Importuj z katalogu nadrzędnego”:

importować «mymodule», który znajduje się w katalogu macierzystego aktualnego modułu:

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

edycja Niestety, atrybut __file__ nie zawsze jest ustawiony. bardziej bezpieczny sposób, aby uzyskać parentdir jest przez moduł wglądu:

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

To mi pomogło. – odigity

+0

Remi - Dziękuję za dosłowną odpowiedź. Znalazłem to przydatne przy pisaniu kodu testowego dla aplikacji Pythona. Mogę umieścić kod testowy w podkatalogu i mogę rozpocząć testy bez modyfikowania istniejącego projektu. (Innymi słowy, konwersja istniejącego kodu do modułu przed przeprowadzeniem testów byłaby niewłaściwą kolejnością robienia rzeczy z perspektywy zarządzania ryzykiem wprowadzenia błędów do działającego kodu.) Twoja metoda zmiany ścieżki modułu jest przydatna. –

+0

To jedyna rzecz, która po prostu działa, dzięki! –