2016-08-05 17 views
6

Zauważyłem, że importowanie modułów w Pythonie jest skomplikowane, więc robię eksperymenty, aby je wyczyścić. Oto moja struktura plików:ImportError: Brak modułu o nazwie pakiet

PythonTest/ 
    package/ 
    __init__.py 
    test.py 

Zawartość __init__.py:

package = 'Variable package in __init__.py' 
from package import test 

Zawartość test.py:

from package import package 
print package 

Kiedy pozostać poza package (w PythonTest) i wykonać python package/test.py, Otrzymuję:

Traceback (most recent call last): 
    File "package/test.py", line 1, in <module> 
    from package import package 
ImportError: No module named package 

Oczekiwana moc wyjściowa to Variable package in __init__.py. Co ja robię źle?


Jednak mogę uzyskać oczekiwane wyjście w trybie interaktywnym:

sunqingyaos-MacBook-Air:PythonTest sunqingyao$ python 
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import package 
Package in __init__.py 
+0

Wygląda na to, że ścieżka wyszukiwania modułów nie jest ustawiona, aby pakiet 'pakiet' mógł zostać znaleziony. – user2357112

+0

@ user2357112 Więc powinienem ustawić 'PYTHONPATH' lub zmodyfikować' sys.path'? Ale dlaczego wszystko jest w porządku w trybie interaktywnym? –

+0

Domyślam się, że uruchamiasz tryb interaktywny z tego samego katalogu co plik, więc ścieżka staje się automatycznie częścią ścieżki wyszukiwania. Spróbuj uruchomić python z zupełnie innego katalogu. – WombatPM

Odpowiedz

5

pierwsze Zobaczmy jak Python wyszukiwania pakietów i modułów. sys.path

A list of strings that specifies the search path for modules. Initialized from the environment variable PYTHONPATH , plus an installation-dependent default.

To są ścieżki wyszukiwania. Dlatego jeśli twój moduł/pakiet znajduje się w jednym z sys.path, interpreter python może go znaleźć i zaimportować. Dokument mówi więcej:

As initialized upon program startup, the first item of this list, path[0] , is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first.

Na przykład zmodyfikowałem test.py.

import sys; import pprint 
pprint.pprint(sys.path) 

from package import package 
print package 

Istnieją dwa przypadki:

$ python package/test.py 
['/Users/laike9m/Dev/Python/TestPython/package', 
'/usr/local/lib/python2.7/site-packages/doc2dash-2.1.0.dev0-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/zope.interface-4.1.3-py2.7-macosx-10.10-x86_64.egg', 
'/usr/local/lib/python2.7/site-packages/six-1.10.0-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/colorama-0.3.3-py2.7.egg', 

Jak widać, path[0] jest /Users/laike9m/Dev/Python/TestPython/package, który jest katalog zawierający skrypt test.py, który został użyty do wywołania interpretera Pythona.

$ python           
Python 2.7.12 (default, Jun 29 2016, 14:05:02) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import package 
['', 
'/usr/local/lib/python2.7/site-packages/doc2dash-2.1.0.dev0-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/zope.interface-4.1.3-py2.7-macosx-10.10-x86_64.egg', 
'/usr/local/lib/python2.7/site-packages/six-1.10.0-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/colorama-0.3.3-py2.7.egg', 
... 

Teraz przychodzi drugim przypadku, gdy wywoływany interaktywnie „path[0] jest pusty ciąg znaków, który kieruje Python szukać modułów w bieżącym katalogu jako pierwszy.” Jaki jest bieżący katalog? . /Users/laike9m/Dev/Python/TestPython/ (patrzeć to jest droga na moim komputerze, jest to równoznaczne z drogi do PythonTest w danym przypadku)

Teraz znasz odpowiedzi:

  1. Dlaczego python package/test.py dają ImportError: No module named package?

    Ponieważ tłumacz nie "widzi" paczki. Aby tłumacz mógł wiedzieć o pakiecie package, PythonTest musi być w sys.path, ale nie jest.

  2. Dlaczego to działa w trybie interaktywnym?

    Ponieważ teraz PythonTest jest w sys.path, więc tłumacz może zlokalizować pakiet package.

Powiązane problemy