2012-02-14 14 views
16

Wielopoziomowe względna importWielopoziomowe względna import

Mam następującą strukturę folderów

top\ 
    __init__.py 
    util\ 
     __init__.py 
     utiltest.py 
    foo\ 
     __init__.py 
     foo.py 
     bar\ 
     __init__.py 
     foobar.py 

chcę uzyskać dostęp z foobar.py moduł utiltest.py. Próbowałem następujących względną import, ale to nie działa: from ...util.utiltest import *

zawsze dotrzesz ValueError: Attempted relative import beyond toplevel package

Jak zrobić taką multileve względną importu?

+1

dlaczego import względny? bezwzględny import powinien być najłatwiejszym sposobem zrobienia tego;): 'from util.utiltest import *' –

Odpowiedz

12

musi importować foobar z folderu nadrzędnego top:

import top.foo.bar.foobar 

Mówi Python że top jest top pakiet poziom. Względny import możliwy jest tylko wewnątrz paczki.

11

Zdaję sobie sprawę, że jest to stare pytanie, ale uważam, że zaakceptowana odpowiedź prawdopodobnie pomija główny problem z kodem pytającego. Nie jest to błędem, ściśle rzecz biorąc, ale daje sugestię, że tylko przypadkowo pracuje się nad prawdziwym problemem.

Prawdziwym problemem jest to, że plik foobar.py w top\foo\bar jest uruchamiany jako skrypt. Gdy zostanie podjęty (odpowiedni!) Import względny, nie powiedzie się, ponieważ interpreter języka Python nie rozumie struktury pakietu.

Najlepszym rozwiązaniem tego problemu jest uruchomienie foobar.py nie według nazwy pliku, ale zamiast używać flagi -m do tłumacza, aby poinformować go, aby uruchomić moduł top.foo.bar.foobar. W ten sposób Python będzie znał główny moduł, który ładuje w pakiecie, i będzie dokładnie wiedział, do czego odnosi się względny import.