2013-05-27 20 views
24

Mam następującą strukturę katalogów:Importować plik z katalogu nadrzędnego?

application 
    tests 
     main.py 
    main.py 

application/main.py zawiera kilka funkcji.

tests/main.py będzie zawierać moje testy dla tych funkcji, ale nie mogę zaimportować głównego poziomu main.py. Pojawia się następujący błąd:

ImportError: Import by filename is not supported. 

Ja próbuje importować przy użyciu następującej składni:

import main 

Co robię źle?

+0

bym najpierw zapoznać się z dokumentacją: http://docs.python.org/2/tutorial /modules.html#packages – Blender

+0

Nie można importować tej samej nazwy pliku, nad którym pracujesz. – squiguy

+0

W jakim pliku robisz 'import main'? – Aivar

Odpowiedz

4

Nie można importować elementów z katalogów macierzystych/rodzeństwa jako takich. Możesz importować tylko elementy z katalogów znajdujących się na ścieżce systemowej lub katalogu bieżącego lub podkatalogów w pakiecie. Ponieważ nie masz plików __init__.py, twoje pliki nie tworzą paczki, a możesz je importować tylko umieszczając je w ścieżce systemowej.

+1

Powiedzenie bez kwalifikacji, że nie możesz, jest trochę mocne. Nie możesz tego zrobić bez odrobiny dodatkowego wysiłku, ale wszystko co musisz zrobić, to umieścić katalog nadrzędny na ścieżce i możesz to zrobić. –

+2

@BryanOakley: To zależy od tego, co powiedziałem o "umieszczeniu ich na ścieżce systemowej". – BrenBarn

+0

+ po przejściu przez wiele SOQ zdałem sobie sprawę, że python jest ślepy, aby wyszukać w katalogach nadrzędnych. – sakhunzai

10

Musisz dodać aplikację dir do ścieżki:

import sys 
sys.path.append("/path/to/dir") 
from app import object 

lub z muszli:

setenv PATH $PATH:"path/to/dir" 

W przypadku korzystania z systemu Windows: Dodawanie zmiennej ścieżka w windows.

Albo z wiersza poleceń:

set PATH=%PATH%;C:\path\to\dir 
8

Przede wszystkim trzeba dokonać katalogów w pakietach, dodając __init__.py pliki:

application 
    tests 
     __init__.py 
     main.py 
    __init__.py 
    main.py 

Następnie należy upewnić się, że katalog powyżej aplikacji jest na sys.path. Istnieje wiele sposobów, aby to zrobić, jak złożenie wniosku infto pakietu i instalowania go, lub po prostu wykonując rzeczy w prawo folderów itp

Then your imports will work.

+6

Dodawanie '__init__.py' tworzysz katalogi w pakiety, a nie moduły. – raben

31

Jeśli chcesz skrypt być bardziej przenośne, rozważ znalezienie automatycznie katalogu nadrzędnego:

import os, sys 
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
# import ../db.py 
import db 
1

w python. istnieje dla samego katalogu, .. dla katalogu nadrzędnego zaimportować plik z katalogu nadrzędnego można wykorzystać ..

from .. import filename (without .py extension)

+1

To nie działało dla mnie, 'ValueError: Próba relatywnego importu w nie-pakiecie' – nobism

Powiązane problemy