Risposte:
Non è così che funziona PYTHONPATH; PYTHONPATH tratta il suo percorso di ricerca in modo diverso dal PATH della shell. Diciamo che lo faccio:
$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py
Questo funzionerà, in Python ( sys.path
includerà la directory corrente):
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
>>> import a, b # Works
>>> quit()
Tuttavia, le sottodirectory vengono trattate come pacchetti quando __init__.py
è presente nella directory e vengono ignorate da PYTHONPATH altrimenti:
$ 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
Per arrivare a qualcosa in quella sottodirectory, questo funzionerebbe:
>>> from pkg import c # Works
>>> import pkg.c # Works
Per creare una soluzione in cui viene aggiunta ogni sottodirectory di PYTHONPATH, è necessario aggiungere esplicitamente ogni cartella a PYTHONPATH o a livello di sys.path
programmazione. Questo comportamento è intenzionale e non si comporta come il PATH della shell. Dato il supporto dell'interprete per i pacchetti in questo senso, sicuramente c'è un modo migliore per realizzare ciò che stai cercando?
Naturalmente è possibile aggiungere sottodirectory di una directory alla variabile PYTHONPATH usando la shell. Attualmente uso qualcosa di simile al seguente nel mio .bashrc:
export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"
Ciò include tutte le sottodirectory della cartella utente a una profondità di 2 nella struttura. Il comando find individua le directory ('-type d'), e i seguenti comandi sed e tr formattano l'output nel solito modo delle variabili PATH.
Tralasciando '-maxdepth 2' includerebbe tutte le sottodirectory della cartella home, che probabilmente è molto da cercare. Forse questo dovrebbe essere fatto solo nella directory $ HOME / repository / python-stuff.