Переменная окружения PYTHONPATH… как мне впоследствии создать каждый подкаталог?

9

В настоящее время я делаю это:

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

Как я могу сделать так, чтобы PYTHONPATH мог включать все подкаталоги?

PYTHONPATH = /home/$USER/....and-all-subdirectories
Alex
источник

Ответы:

14

Это не то, как работает 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. Учитывая поддержку интерпретатором пакетов в этом отношении, наверняка есть лучший способ добиться того, что вы ищете?

Джед смит
источник
3
Чувак, я бы хотел, чтобы каждый сайт проверял другие ваши аккаунты, прежде чем отказывать вам в публикации прав Это отстой, начиная с повторения, особенно с такими вещами, как ограничение в один URL ... (У меня было больше ссылок для вас, OP)
Джед Смит
1

Это не то, как работают переменные окружения PATH - вы предоставляете ему каталог верхнего уровня, и приложение должно переписать дерево каталогов, если это необходимо.

EEAA
источник
Итак, если у меня есть файл python в /home/$USER/myfile.py Могу ли я импортировать это?
Алекс
Конечно, почему ты не мог?
EEAA
1

Конечно, можно добавить подкаталоги каталога в переменную 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.

раскрутить
источник