Ich entwickle / teste ein Paket in meinem lokalen Verzeichnis. Ich möchte es in den Interpreter (v2.5) importieren, aber sys.path enthält nicht das aktuelle Verzeichnis. Im Moment tippe ich ein sys.path.insert(0,'.')
. Gibt es einen besseren Weg?
Ebenfalls,
from . import mypackage
schlägt mit diesem Fehler fehl:
ValueError: Attempted relative import in non-package
Antworten:
Sie können relative Importe nur aus einem Modul verwenden, das wiederum als Teil eines Pakets importiert wurde - Ihr Skript oder interaktiver Interpreter war dies natürlich nicht
from . import
(was bedeutet, dass "aus demselben Paket importiert wurde, aus dem ich importiert wurde") funktioniert nichtimport mypackage
in Ordnung sein wird , wenn Sie das übergeordnete Verzeichnis gewährleisten vonmypackage
in istsys.path
(wie Sie Ihr aktuelles Verzeichnis erhalten verwalten weg von ,sys.path
weiß ich nicht - tun Sie etwas seltsam in site.py, oder ...)sys.path
Es gibt keinen besseren Weg, um Ihr aktuelles Verzeichnis wieder dort abzulegen, als es dort abzulegen.quelle
Siehe die Dokumentation zu sys.path:
http://docs.python.org/library/sys.html#sys.path
Zitieren:
Es ist also nicht erforderlich, mit sys.path einen Affen zu erstellen, wenn Sie den Python-Interpreter über das Verzeichnis starten, in dem sich Ihr Modul befindet.
Um Ihr Paket zu importieren, gehen Sie einfach wie folgt vor:
Da sich das Verzeichnis mit dem Paket bereits in sys.path befindet, sollte es einwandfrei funktionieren.
quelle
sys.path
sodass Dateien vor Dateien an anderer Stelle in der Arbeitsumgebung gefunden werden sollten.sys.path.insert(0, new_path)
eher alssys.path.append(new_path)
.Halte es einfach:
quelle
Wenn Sie ein unverändertes Python-Skript ausführen möchten, um Bibliotheken aus einem bestimmten lokalen Verzeichnis zu importieren, können Sie die
PYTHONPATH
Umgebungsvariable festlegen - z. B. in bash:Wenn Sie nur möchten, dass es aus dem aktuellen Arbeitsverzeichnis importiert wird, verwenden Sie die
.
Notation:quelle
Eine einfache Möglichkeit, dies zum Laufen zu bringen, besteht darin, Ihr Skript mit dem Python-
-m
Flag aus dem übergeordneten Verzeichnis auszuführen , zpython -m packagename.scriptname
. In dieser Situation benötigen Sie natürlich eine__init__.py
Datei, um Ihr Verzeichnis in ein Paket umzuwandeln.quelle
Wenn sich in einem Paket setup.py befindet , ist es besser, es zu installieren
quelle
Die Verwendung
sys.path
sollte bereits das aktuelle Verzeichnis enthalten.Versuchen:
oder:
Es kann jedoch sein, dass dies keine gute Vorgehensweise ist. Warum also nicht einfach Folgendes verwenden:
quelle
Ein bisschen spät zur Party, aber das hat bei mir funktioniert:
Wenn eine leere Zeichenfolge vorhanden ist, weiß Python anscheinend, dass sie im aktuellen Verzeichnis angezeigt werden sollte. Ich hatte keine leere Zeichenfolge
sys.path
, was diesen Fehler verursachte.quelle
Ich habe
pathlib
mein Modulverzeichnis zu meinem Systempfad hinzugefügt, da ich vermeiden wollte, das Modul als Paket zu installieren, und die Antwort von @maninthecomputer bei mir nicht funktioniert hatquelle