2014-12-03 13 views
5

Mam dwa pliki w tym samym katalogu, a nie ma __init__.py pliki w dowolnym miejscu:Jak działa ten import Pythona?

c:\work\test>tree 
. 
|-- a 
| `-- a 
|  |-- a1.py 
|  `-- a2.py 
`-- b 

jeden plik importuje drugi:

c:\work\test>type a\a\a1.py 
print 'a1-start' 
import a2 
print 'a1-end' 

c:\work\test>type a\a\a2.py 
print 'a2' 

Import powiedzie nawet podczas uruchamiania z zupełnie innej lokalizacji :

c:\work\test\b>python ..\a\a\a1.py 
a1-start 
a2 
a1-end 

biegnę

c:\work\test>python -V 
Python 2.7.3 

i moje PYTHONPATH i PYTHONHOME zmienne nie są ustawione

c:\work\test>echo %PYTHONPATH% %PYTHONHOME% 
%PYTHONPATH% %PYTHONHOME% 

Jak a1.py znaleźć a2?

+0

bym Hazzard przypuszczenie, że podobnie jak PHP, Python by ocenić wiele lokalizacji w celu znalezienia plików, łącznie z bieżącego katalogu roboczego? –

+0

bieżący katalog roboczy jest' test \ B' ... – thebjorn

+0

skrypt działa z jednak, wybacz mój brak wiedzy Pythona, ale php i uważam, że większość języków traktowałaby ten scenariusz podobnie, kiedy wpisujesz .. to zmienia katalog roboczy dla tego skryptu tylko –

Odpowiedz

8

cytat z module docs (kopalnia nacisk):

„Gdy moduł o nazwie spam jest importowany, interpreter najpierw szuka wbudowanego modułu o tej nazwie Jeśli nie znajdzie, wtedy wyszukuje. plik o nazwie spam.py na liście katalogów podanych w zmiennej sys.path sys.path jest inicjowany z tych miejsc..

  • katalogu zawierającego skrypt wejściowy (lub bieżący katalog)
  • PYTHONPATH (lista nazwy katalogów o takiej samej składni jak zmienna powłoki PATH).
  • domyślna instalacja zależne.”
+0

Ah, byłem zdezorientowany, ponieważ nie widziałem odniesienia do 'test \ a \ a' nigdzie w' sys.path' (które zaczyna się od '['', 'c: \\ python27 \\ lib .. '). – thebjorn

+0

@thebjorn: "" "odnosi się do odważnej części odpowiedzi ofrommel. Zobacz ['sys.path'] (https://docs.python.org/3/library/sys.html#sys.path). – Kevin