Antworten:
So funktioniert PYTHONPATH nicht; PYTHONPATH behandelt seinen Suchpfad anders als Shell PATH. Nehmen wir an, ich mache das:
$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py
Dies funktioniert in Python ( sys.path
einschließlich des aktuellen Verzeichnisses):
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
>>> import a, b # Works
>>> quit()
Unterverzeichnisse werden jedoch als Pakete behandelt, wenn __init__.py
sie im Verzeichnis vorhanden sind, und von PYTHONPATH ansonsten ignoriert :
$ 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
Um zu etwas in diesem Unterverzeichnis zu gelangen, würde dies funktionieren:
>>> from pkg import c # Works
>>> import pkg.c # Works
Um eine Lösung zu erstellen, bei der jedes Unterverzeichnis in Ihrem PYTHONPATH hinzugefügt wird, müssen Sie jeden Ordner explizit oder sys.path
programmgesteuert zu PYTHONPATH hinzufügen . Dieses Verhalten ist beabsichtigt und verhält sich nicht wie Shell-PATH. Angesichts der Unterstützung des Dolmetschers für Pakete in dieser Hinsicht gibt es sicherlich einen besseren Weg, um das zu erreichen, wonach Sie suchen?
So funktionieren Umgebungs-PATH-Variablen nicht - Sie geben ihm das Verzeichnis der obersten Ebene und es liegt an der Anwendung, den Verzeichnisbaum bei Bedarf zu rekursieren.
Natürlich können Sie Ihrer PYTHONPATH-Variablen mithilfe der Shell Unterverzeichnisse eines Verzeichnisses hinzufügen. Ich verwende derzeit in meiner .bashrc etwas Ähnliches wie das Folgende:
export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"
Dies würde alle Unterverzeichnisse Ihres Benutzerordners bis zu einer Tiefe von 2 im Baum einschließen. Der Befehl find sucht die Verzeichnisse ('-type d'), und die folgenden Befehle sed und tr formatieren die Ausgabe auf die übliche Weise wie PATH-Variablen.
Wenn Sie '-maxdepth 2' weglassen, werden alle Unterverzeichnisse Ihres Home-Ordners angezeigt, was wahrscheinlich ziemlich viel zu suchen ist. Möglicherweise sollte dies nur in Ihrem Verzeichnis $ HOME / repository / python-stuff erfolgen.