Відповіді:
Це не так, як працює 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 знаходить каталоги ('-тип d'), а наступні команди sed і tr форматують вихідний звичайний спосіб змінних PATH.
Якщо залишити '-maxdepth 2', буде включено всі підкаталоги вашої домашньої папки, які, ймовірно, досить багато для пошуку. Можливо, це слід зробити лише у вашому каталозі $ HOME / сховища / python-stuff.