Yanıtlar:
PYTHONPATH böyle çalışmaz; PYTHONPATH arama yolunu PATH kabuğundan farklı şekilde ele alır. Diyelim ki bunu yapıyorum:
$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py
Bu, Python'da çalışacaktır ( sys.path
geçerli dizini içerecektir):
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
>>> import a, b # Works
>>> quit()
Ancak, alt dizinler dizinde bulunduğunda paketler olarak ele alınır __init__.py
ve aksi takdirde PYTHONPATH tarafından yoksayılır :
$ 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
Bu alt dizindeki bir şeye ulaşmak için, bu işe yarayacaktır:
>>> from pkg import c # Works
>>> import pkg.c # Works
PYTHONPATH'nizdeki her alt dizinin eklendiği bir çözümü almak için, her klasörü PYTHONPATH'a veya sys.path
programlı olarak açıkça eklemeniz gerekir . Bu davranış kasıtlıdır ve kabuk PATH gibi bir şey yapmaz . Tercümanın bu konudaki paketlere verdiği destek göz önüne alındığında, kesinlikle peşinde olduğunuz şeyi başarmanın daha iyi bir yolu var mı?
Tabii ki kabuğu kullanarak PYTHONPATH değişkeninize bir dizinin alt dizinlerini eklemek mümkündür. Şu anda .bashrc dosyamda aşağıdakine benzer bir şey kullanıyorum:
export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"
Bu, kullanıcı klasörünüzün tüm alt dizinlerini ağaçta 2 derinliğe kadar içerecektir. Find komutu dizinleri ('-type d') bulur ve aşağıdaki sed ve tr komutları çıktıyı normal PATH değişkenleri biçiminde biçimlendirir.
'-Maxdepth 2' 'yi terk etmek, ana klasörünüzün tüm alt dizinlerini içerecektir, ki bu muhtemelen aranacak çok şeydir. Belki de bu sadece $ HOME / repository / python-stuff dizininizde yapılmalıdır.