2012-02-03 9 views
11

Powiel możliwe:
How to properly use relative or absolute imports in Python modules?pyton względna przykład import kod nie działa

mam ten układ pliku, jak pokazano w poniższym przykładzie: (do pobrania tutaj: http://www.mediafire.com/?oug42nzvxrvoms4) http://www.python.org/dev/peps/pep-0328/#guido-s-decision

Moduł X zawiera:

from .moduleY import spam 
from .moduleY import spam as ham 
from . import moduleY 
from ..subpackage1 import moduleY 
from ..subpackage2.moduleZ import eggs 
from ..moduleA import foo 
from ...package import bar 
from ...sys import path 

i to, co się dzieje:

C:\package\subpackage1>python moduleX.py 
Traceback (most recent call last): 
    File "moduleX.py", line 1, in <module> 
    from .moduleY import spam 
ValueError: Attempted relative import in non-package 

Mam Python 2.7.2. Mam pliki w każdym katalogu. Dlaczego ten kod nie działa?

+4

Uważam, że te pytania i odpowiedzi są bardziej przydatne niż ten, który został oznaczony jako duplikat. – ArtOfWarfare

+0

Robot duplikaty taggerów ;-) – nicorellius

Odpowiedz

20

Od docs:

widać to:

import Względne używać nazwa atrybutu modułu za do określenia pozycji tego modułu w hierarchii pakietu . Jeśli nazwa modułu nie zawiera żadnych informacji o pakiecie (np. Jest ustawiona na "główna"), wówczas import względny jest rozwiązywany tak, jakby moduł był modułem najwyższego poziomu, niezależnie od tego, gdzie moduł jest faktycznie zlokalizowany w systemie plików.

Wykonując to jako python moduleX.py, robisz dokładnie powyższe. Zamiast tego spróbuj tego:

python -m package.subpackage1.moduleX 

Spowoduje to zaimportowanie modułu X i umieszczenie najwyższego poziomu w pakiecie. Biegnie od szczytu hierarchii:

package/ 
    __init__.py 
    subpackage1/ 
     __init__.py 
     moduleX.py 
     moduleY.py 
    subpackage2/ 
     __init__.py 
     moduleZ.py 
    moduleA.py 

czyli w danym przypadku z c:\ bezpośrednio:

c:\>python -m package.subpackage1.moduleX 

Uwaga jedno - przywóz w moduleX.py są takie:

from .moduleY import spam 
from .moduleY import spam as ham 
from . import moduleY 
from ..subpackage1 import moduleY 
from ..subpackage2.moduleZ import eggs 
from ..moduleA import foo 
from ...package import bar 
from ...sys import path 

Drugi na koniec:

from ...package import bar 

wymaga, aby folder główny (c:\ w twoim przypadku) był pakietem (tj. mieć __init__.py). Wymaga także zmiennej barowej zdefiniowanej w package\__init__.py, której aktualnie nie ma (przetestuj ją w ten sposób).Wymaga to również podniesienia poziomu o jeden poziom - więc musisz umieścić folder package w innym folderze (kończysz z c:\toppackage\package) i uruchomić c:\python -m toppackage.package.subpackage1.moduleX.

dla tej linii:

from ...sys import path 

istnieje notatka w powyższym PEP 328 linkiem:

Należy zauważyć, że podczas gdy ten ostatni przypadek jest legalne, to z pewnością zniechęca („szalony” był słowo użyte Guido).

Zobacz również inne SOqs o to, że może pomóc:

Mam nadzieję, że to pomoże.