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.
Uważam, że te pytania i odpowiedzi są bardziej przydatne niż ten, który został oznaczony jako duplikat. – ArtOfWarfare
Robot duplikaty taggerów ;-) – nicorellius