Umgebungsvariable PYTHONPATH… wie erstelle ich danach jedes Unterverzeichnis?

9

Ich mache derzeit Folgendes:

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

Wie kann ich dafür sorgen, dass der PYTHONPATH alles Unterverzeichnis enthält?

PYTHONPATH = /home/$USER/....and-all-subdirectories
Alex
quelle

Antworten:

14

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.patheinschließ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__.pysie 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.pathprogrammgesteuert 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?

Jed Smith
quelle
3
Mann, ich wünschte, jede Site würde Ihre anderen Konten überprüfen, bevor Sie die Veröffentlichungsrechte verweigern. Es ist scheiße, mit rep von vorne zu beginnen, besonders mit Dingen wie dem Limit für eine URL ... (Ich hatte mehr Referenzen für Sie, OP)
Jed Smith
1

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.

EEAA
quelle
Wenn ich also eine Python-Datei unter /home/$USER/myfile.py habe, kann ich diese importieren?
Alex
Klar, warum konntest du nicht?
EEAA
1

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.

Spinup
quelle