2017-11-30 89 views
5

Tak więc, bawię się pakowaniem skryptu Pythona, który napisałem, i ma moduł częściowy, nazwijmy go: submodule. Struktura folderów wygląda następująco:Python może zaimportować moduł, który nie jest zainstalowany

cool_script/ 
    setup.py 
    cool_script.py 
    submodule/ 
    __init__.py 
    implementation.py 

Teraz, po wielu pip install . i pip install -e . połączeń, mam sytuację, w której mogą być importowane submodule globalnie. Bez względu na to, gdzie w moim systemie, to zawsze działa:

$ python3 
[...] 
>>> import submodule 
>>> submodule.__file__ 
'/home/me/fake/path/cool_script/submodule/__init__.py' 

Ale nie wiem dlaczego.

Pakiet, który zrobiłem, został odinstalowany ponownie, a pip nie może znaleźć modułu podległego w swoim indeksie. Nie ma nic w dist-pakietach albo, ręcznie usunięty cool_script.egg-link że wciąż siedzą tam:

$ ls /usr/local/lib/python3.4/dist-packages | ack cool 
$ ls /usr/local/lib/python3.4/dist-packages | ack submodule 
$ 

PYTHONPATH jest pusta, a także:

$ echo $PYTHONPATH 

$ 

Dlaczego Python znać lokalizację submodule ? Jak mogę się dowiedzieć?

+0

Czy został zainstalowany w virtualenv? Czy to system Linux? –

+0

To naprawdę jest system Linux i nie, przeprowadziłem te eksperymenty w moim środowisku globalnym. Wiem, że to było bardzo głupie. Nauczyłem się, jak sądzę. – iFreilicht

+0

Może to zabrzmieć głupio, ale czy próbowałeś zrestartować komputer? Być może jest to po prostu zbuforowane gdzieś – RunOrVeith

Odpowiedz

3

Najpierw uruchom python -c "import site; print(site.getsitepackages())". Będzie on wydrukować listę tak:

['/XXX/something/site-packages'] 

Zazwyczaj jest tylko jeden tor na tej liście, a to wskazuje na katalog, w którym pip instaluje skrypty. Możesz wpisać w to ls, jeśli jesteś ciekawy: ls /XXX/something/site-packages/.

Co ciekawsze, pip umieszcza plik "link" w tym katalogu, gdy używasz instalacji dla programistów (a.k.a. pip install -e). Plik "link" nosi nazwę oryginalnego projektu z rozszerzeniem .egg-link na końcu.

Prawdopodobnie w tym katalogu znajduje się plik cool_script.egg-link. A jeśli spróbujesz go wydrukować, powinieneś zauważyć, że jego zawartość zawiera listę oryginalnych lokalizacji systemu plików twojego modułu. Coś jak:

$ cat /XXX/something/site-packages/cool_script.egg-link 
/home/me/fake/path/cool_script/ 
. 

ten sposób pip zapisy, że ma zainstalowane coś w trybie dewelopera, ale to nie jest to, jak Python rzeczywiście wie jak znaleźć swój moduł (to byłoby zbyt proste, prawda? -)).

Python nie wie o .egg-link plików, ale czyta wszystkie .pth pliki w katalogu site-packages uzyskać dodatkowe ścieżki dla sys.path (*). Tak więc, aby Python mógł importować instalacje w trybie programisty, pip zapisuje wszystkie swoje ścieżki w jednym pliku o nazwie .pth tradycyjnie zwanym easy-install.pth (ponieważ stare narzędzie easy-install faktycznie było pionierem tej techniki). A jeśli wydrukowanie tego pliku, dostaniesz listę wszystko projektów ścieżek zainstalowanych w trybie dewelopera:

$ cat /XXX/something/site-packages/easy-install.pth 
/home/me/fake/path/cool_script/ 
/home/me/another/project/ 

i można sprawdzić, że rzeczywiście wszystkie te ścieżki wymienione w easy-install.pth rzeczywiście dodane do Twojego sys.path .

(*) Technicznie, częścią Pythona, która czyta ten plik .pth jest moduł site, który jest normalnie automatycznie importowany podczas uruchamiania. Istnieje jednak możliwość wyłączenia modułu site, na przykład za pomocą python -S. W takim przypadku zobaczysz, że sys.path nie zawiera ani katalogu site-packages, ani ścieżek instalacyjnych programisty.

+0

To wszystko, folder był wymieniony w 'easy-install.pth'. Usunięcie go rozwiązało problem! Dzięki za dokładne wyjaśnienie. – iFreilicht

Powiązane problemy