Сейчас я делаю это:
PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff
Как я могу сделать так, чтобы PYTHONPATH мог включать все подкаталоги?
PYTHONPATH = /home/$USER/....and-all-subdirectories
PYTHONPATH работает не так; PYTHONPATH обрабатывает свой путь поиска иначе, чем PATH оболочки. Скажем, я делаю это:
$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py
Это будет работать в Python (sys.path
будет включать текущий каталог):
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
>>> import a, b # Works
>>> quit()
Однако подкаталоги рассматриваются как пакеты, когда __init__.py
присутствует в каталоге и являются игнорируется от 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
Чтобы получить что-то в этом подкаталоге, это сработает:
>>> from pkg import c # Works
>>> import pkg.c # Works
Чтобы развернуть решение, в которое добавляется каждый подкаталог в вашем PYTHONPATH, вам необходимо явно добавить каждую папку в PYTHONPATH или sys.path
программно. Такое поведение намеренно и ведет себя ничего как оболочка PATH. Учитывая поддержку интерпретатором пакетов в этом отношении, конечно, есть лучший способ выполнить то, что вам нужно?
Конечно, можно добавить подкаталоги каталога в вашу переменную PYTHONPATH с помощью оболочки. В настоящее время я использую что-то похожее на следующее в моем .bashrc:
export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"
Это будет включать все подкаталоги вашей пользовательской папки на глубину 2 в дереве. Команда find находит каталоги ('-type d'), а следующие команды sed и tr форматируют вывод обычным способом переменных PATH.
Если вы не укажете «-maxdepth 2», то будут включены все подкаталоги вашей домашней папки, в которых, вероятно, будет довольно много поиска. Возможно, это следует делать только в вашем каталоге $ HOME / repository / python-stuff.
Переменные PATH среды работают не так - вы даете ему каталог верхнего уровня, и приложение может рекурсивно просматривать дерево каталогов, если это необходимо.