Zmienna środowiskowa PYTHONPATH… jak później utworzyć każdy podkatalog?

9

Obecnie robię to:

PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff

Jak mogę to zrobić, aby ścieżka PYTHONPATH mogła zawierać wszystkie podkatalogi?

PYTHONPATH = /home/$USER/....and-all-subdirectories
Alex
źródło

Odpowiedzi:

14

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.pathobejmie 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__.pysą 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.pathprogramowo. 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?

Jed Smith
źródło
3
Człowieku, chciałbym, aby każda witryna sprawdziła twoje inne konta, zanim odmówisz Ci uprawnień do publikowania. To jest do bani zaczynając od powtórzenia, szczególnie z takimi rzeczami jak limit jednego adresu URL ... (Miałem dla ciebie więcej referencji, OP)
Jed Smith
1

Nie tak działają zmienne środowiskowe PATH - dajesz mu katalog najwyższego poziomu, a aplikacja musi rekompensować drzewo katalogów, jeśli zajdzie taka potrzeba.

EEAA
źródło
Więc jeśli mam plik Pythona w katalogu /home/$USER/myfile.py Czy mogę go zaimportować?
Alex
Jasne, dlaczego nie mogłeś?
EEAA
1

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.

zakręcić
źródło