Wie füge ich ein Python-Modul zu syspath hinzu?

69

Ich habe eine Dateistruktur wie diese:

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

Ich möchte in foo2.py und importieren foo1.py. Ich habe es versucht, aber es funktioniert nicht auf Ubuntu:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
user284474
quelle
Haben Sie eine __init__.pyDatei in Ihrem Ordner? Auf diese Weise erstellt Python Pakete und ermöglicht es Ihnen, Module aus diesem Paket zu importieren. guide.python-distribute.org/creation.html
Bryan
Ich habe init.py-Datei in Common und in TestFolder
user284474
Sie benötigen es im Ordner-Verzeichnis sowie in den Unterordnern, wenn Sie importieren möchten
Bryan
Diese Init .py ist leer?
user284474
1
Ja, es kann leer sein. Es sei denn, Sie benötigen eine bestimmte Konfiguration für Ihr Paket, aber Sie sollten damit einverstanden sein, dass es leer ist
Bryan

Antworten:

115

Wie Python seine Module findet

Streng genommen ist ein Modul eine einzelne Python-Datei, während ein Paket ein Ordner ist, der Python-Dateien zusammen mit einer (möglicherweise leeren) Datei mit dem Namen enthält __init__.py, um Python mitzuteilen, dass es ein Paket ist, aus dem Module importiert werden sollen. In beiden Fällen benötigen Module ihre .pyErweiterung, der Import erfolgt jedoch ohne (siehe weiter unten).

Standardmäßig sucht Python nach seinen Modulen und Paketen in $PYTHONPATH.

Um herauszufinden, was in $ PYTHONPATH enthalten ist, führen Sie den folgenden Code in python (3) aus:

import sys
print(sys.path)

So fügen Sie ein Verzeichnis hinzu

Gelegentlich

In einer Python-Datei können Sie gelegentlich Pfade zum Standardpfad hinzufügen, indem Sie die folgenden Zeilen im head-Abschnitt Ihrer Python-Anwendung oder Ihres Skripts einfügen:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

Zum Beispiel:

Wenn ich einen Ordner: habe /home/myname/pythonfilesund die Datei module_1.pyin diesem Verzeichnis importieren möchte , füge ich Folgendes zum Kopfteil meines Codes hinzu:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

Und ich kann die Datei einfach importieren module_1.py:

import module_1

Wenn ich ein Paket erstelle und Module aus dem Paket importieren möchte, muss ich einen Ordner erstellen $PYTHONPATH, in dem die Module enthalten sind, zusammen mit einer (möglicherweise leeren) Datei, die aufgerufen wird__init__.py

Zum Beispiel:

So importiert aus einem Paket (Ordner) genannt my_packagein /home/myname/pythonfiles, fügen Sie den /home/myname/pythonfilesPfad zu Ihrem $PYTHONPATH, wie in Beispiel 1, und das Modul importieren genannt module_2.py(im Paketordner) einfach mit: `

from <packagename> import module_2

Verzeichnisse $PYTHONPATHdauerhaft hinzufügen :

Fügen Sie Ihrer ~/.profileDatei die folgende Zeile hinzu .

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

Unterverzeichnisse

Innerhalb eines Pakets werden Unterverzeichnisse nicht einfach so eingeschlossen. Sie müssen die Verzeichnisse "verketten". So importieren Sie ein Modul module_3.pyinnerhalb eines Ordners subfolderinnerhalb eines Ordners packagename:

import packagename.subfolder.module_3

Angesichts der Tatsache, dass alle Unterordner im Paket ihre eigene __init__.pyDatei enthalten.

Wenn sich ein Modul im selben Verzeichnis wie das Skript oder die Anwendung befindet

Es ist nicht erforderlich, den Pfad zu einem Modul einzufügen, wenn es sich im selben Verzeichnis befindet wie das Skript oder die Anwendung. Es wird automatisch hinzugefügt.

Beispiel:

Wenn ich einen Ordner mit script.pyund habe module.py, kann ich das Modul einfach wie folgt importieren:

import module
Jacob Vlijm
quelle
Ich möchte auch vorschlagen, python.org/dev/peps/pep-0328 zu lesen, insbesondere , wenn Sie Python 3 als Ziel
festlegen
Warum ist printenv PYTHONPATHnichts?
Stevie G
1
sys.path.append("/path/to/your/package_or_module")Fügt dem Standard auch einen Pfad hinzu und ist weniger verwirrend. Im Vergleich dazu sys.path.insert(0,...)hat das 0als erstes Argument.
Paul Rougieux
1
@PaulRougieux: Das Problem beim Anhängen an den Pfad besteht darin, dass Ihr Modul möglicherweise bereits an einer anderen Stelle im Pfad vorhanden ist (z. B. in einer .egg-Datei) und Sie diese Version Ihres Moduls anstelle der Version in Ihrer Datei abrufen .
Snark
6

Die korrekte Verwendung des relativen Imports ist:

from ..Common import foo1

Und du brauchst auch einen __init__.pyin all deinen Ordnern.

Sylvain Pineau
quelle
1
Vielen Dank. Aber wenn ich ein Modul mit zwei Ordnern habe Wie importiere ich das? von .... Ordner funktioniert nicht
user284474
Funktioniert es mit einem einzigen Level?
Sylvain Pineau
Mit einer einzigen Ebene funktioniert es.
user284474
Okay, könnten Sie diese Antwort bitte annehmen? Für Mehrebenen könnten Sie eine andere Frage stellen, aber schauen Sie sich zuerst diese Frage und diese Antwort an, um zu erfahren, wie Sie Ihre Module in einem Paket am besten aufrufen können
Sylvain Pineau
Trifft dies auf Python 2 oder Python 3 zu? Oder beides?
Alex
2

NB: Diese Antwort ist für die neueste Version von Python 3 veraltet, ist jedoch für eine frühere Version hier. Weitere Informationen finden Sie in den Kommentaren und unter https://www.python.org/dev/peps/pep-0420/.


Im Wesentlichen benötigt jeder Ordner mit Python-Code, den Sie dem Syspath hinzufügen möchten, eine __init__.py-Datei. Diese __init__.py-Dateien können leer sein.

don.joey
quelle
Soweit ich weiß, ist dies nicht mehr der Fall, das Verzeichnis wird jetzt zu einem "Namespace".
Aaron Hall
@ AaronHall interessant, Quelle?
don.joey
1
Probieren Sie dies aus, um es zu beweisen: python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"Hier ist auch eine relevante Dokumentation, PEP 420, die das Hinzufügen der Semantik des Namespace-Pakets beschreibt
Aaron Hall,