2011-01-09 25 views
10

... Teraz wiem, że to pytanie było wielokrotnie zadawane. & Sprawdziłem te inne wątki. Nic nie zadziałało, od użycia sys.path.append (".") Do zaimportowania fooPython: Importowanie pliku z folderu nadrzędnego

Mam plik python, który chce zaimportować plik (który znajduje się w jego katalogu nadrzędnym). Czy możesz mi pomóc dowiedzieć się, w jaki sposób mój plik podrzędny może z powodzeniem zaimportować swój plik do katalogu nadrzędnego. Używam Pythona 2.7

Konstrukcja jest tak jak (każdy katalog ma również __ startowych __ plik .py w nim):

StockTracker/
__Comp/
____a.py
____SubComp/
__ _ __ _b.py

Wewnątrz b.py chciałbym importować a.py: Więc próbowałem każdej z następujących ale nadal dostać błąd wewnątrz b.py mówiąc: „nie ma takiego modułu jest”

import a 

import .a 

import Comp.a 

import StockTracker.Comp.a 

import os 
import sys 
sys.path.append('.') 
import a  
sys.path.remove('.') 
+0

Jak wywołać Pythona? To znaczy, jak to jest znaleźć StockTracker.Comp.SubComp.b? – dkagedal

Odpowiedz

11
from .. import a 

powinno wystarczyć. Działa to tylko w najnowszych wersjach Pythona - od wersji 2.6 wierzę [Edit: since 2.5].

Każdy poziom (Comp i Subcomp) musi również mieć plik __init__.py, aby działało. Powiedziałeś, że tak.

+0

Uważam, że jest od 2.7. To twoja odpowiedź, czy możesz to sprawdzić? – Apalala

+0

Cóż, oboje się mylimy! Jest od 2.5. Dzięki, zaktualizuję to. –

+0

To prawdopodobnie działa. Ale także: Proszę nie. Upewnij się, że bezwzględny import działa w zamian. –

5

Jeśli katalog Comp jest w zmiennej środowiskowej PYTHONPATH, zwykły stary

import a 

zadziała.

Jeśli używasz systemu Linux lub OS X, oraz uruchomienie programu z powłoki bash, można to osiągnąć przez

export PYTHONPATH=$PYTHONPATH:/path/to/Comp 

dla Windows, spójrz na te linki:

EDIT:

Aby programowo zmodyfikować ścieżkę, byłeś na właściwej drodze w oryginalnym pytaniu. Trzeba tylko dodać katalog nadrzędny zamiast bieżącego katalogu.

sys.path.append("..") 
import a 
+0

Dzięki za odpowiedź, nigdy nie słyszałem o zmiennej środowiskowej PYTHONPATH? Czy byłbyś w stanie opracować, w jaki sposób zrobiłbym to, co mówisz? Wewnątrz katalogu StockTracker mam główny plik inicjatora programu o nazwie RunStockTracker.py, powinienem "upewnić się, że katalog Comp jest w twojej zmiennej środowiskowej PYTHONPATH" (w kodzie) w tym pliku? – Sascha

+0

Zaktualizowałem moją odpowiedź. –

+0

Ta odpowiedź ("sys.path.append (" ..') ') jest jedynym, który zadziała, jeśli używasz' b.py' jako ['__main__', czyli środowiska skryptu najwyższego poziomu] (https://docs.python.org/3/library/ __main __. html) –

8

Kiedy pakiety zostały podzielone podpakiety (zgodnie z pakietem dźwięku w przykładzie), można używać bezwzględnych importu w odniesieniu do submodułów z rodzeństwo pakietach. Na przykład, jeśli moduł dźwiękowy sound.filters.vocoder musi użyć modułu echa w pakiecie sound.effects , może on używać od sound.effects import echo.

Począwszy Python 2.5, oprócz do ukrytych importu względnych opisanych powyżej, można napisać wyraźne względne importu z from module import postaci nazwy import oświadczeniu. Te jawne względne importery używają wiodących kropek do wskazania obecnych i nadrzędnych pakietów zaangażowanych w względny import. Od moduł przestrzenny na przykład, można użyć :

from . import echo 
from .. import formats 
from ..filters import equalizer 

Cytat stąd http://docs.python.org/tutorial/modules.html#intra-package-references

Powiązane problemy