Odpowiedzi:
Nie tak działa PYTHONPATH; PYTHONPATH traktuje swoją ścieżkę wyszukiwania inaczej niż PATH powłoki. Powiedzmy, że to robię:
$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py
To zadziała, w Pythonie ( sys.path
obejmie bieżący katalog):
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
>>> import a, b # Works
>>> quit()
Jednak podkatalogi są traktowane jako pakiety, gdy __init__.py
są obecne w katalogu, i w przeciwnym razie są ignorowane przez PYTHONPATH:
$ mkdir /home/jsmith/python/pkg
$ cd /home/jsmith/python/pkg
$ touch __init__.py c.py d.py
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
>>> import a, b # Works
>>> import c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named c
Aby dostać się do czegoś w tym podkatalogu, działałoby to:
>>> from pkg import c # Works
>>> import pkg.c # Works
Aby stworzyć rozwiązanie, w którym dodawany jest każdy podkatalog w PYTHONPATH, musisz jawnie dodać każdy folder do PYTHONPATH lub sys.path
programowo. To zachowanie jest zamierzone i nie zachowuje się tak, jak PATH powłoki. Biorąc pod uwagę wsparcie tłumacza dla pakietów w tym zakresie, z pewnością istnieje lepszy sposób na osiągnięcie tego, czego szukasz?
Oczywiście możliwe jest dodanie podkatalogów katalogu do zmiennej PYTHONPATH przy użyciu powłoki. Obecnie używam czegoś podobnego do następującego w moim .bashrc:
export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"
Obejmuje to wszystkie podkatalogi folderu użytkownika do głębokości 2 w drzewie. Polecenie find lokalizuje katalogi („-type d”), a następujące polecenia sed i tr formatują dane wyjściowe w zwykły sposób dla zmiennych PATH.
Pozostawienie „-maxdepth 2” obejmie wszystkie podkatalogi twojego folderu domowego, co prawdopodobnie jest dość sporym tematem do przeszukania. Być może należy to zrobić tylko w katalogu $ HOME / repository / python-stuff.