Ich habe die folgende Ordnerstruktur.
application/app/folder/file.py
und ich möchte einige Funktionen aus file.py in eine andere Python-Datei importieren, die sich in befindet
application/app2/some_folder/some_file.py
ich habe es versucht
from application.app.folder.file import func_name
und einige andere verschiedene Versuche, aber bisher konnte ich nicht richtig importieren. Wie kann ich das machen?
Antworten:
Standardmäßig können Sie nicht. Beim Importieren einer Datei durchsucht Python nur das aktuelle Verzeichnis, das Verzeichnis, aus dem das Einstiegspunktskript ausgeführt wird, und
sys.path
das Speicherorte wie das Paketinstallationsverzeichnis enthält (es ist tatsächlich etwas komplexer als dieses, aber dies deckt die meisten Fälle ab). .Sie können dem Python-Pfad jedoch zur Laufzeit Folgendes hinzufügen:
quelle
sys.path.append('/path/to/application/app/folder')
ist sauberer imosys.path
gibt a zurücklist
, nicht adeque
, und es wäre dumm, daslist
in adeque
und zurück umzuwandeln .Nichts falsch mit:
Stellen Sie einfach sicher, dass
folder
auch ein enthalten ist__init__.py
, damit es als Paket enthalten sein kann. Ich bin mir nicht sicher, warum die anderen Antworten darüber sprechenPYTHONPATH
.quelle
PYTHONPATH
erforderlich sind. Angenommen, Sie haben zwei Ordner auf derselben Ebene:A
undB
.A
hat eine__init.py__
. Versuchen Sie, etwas vonB
innen zu importierenA
.init.py
oder__init__.py
Datei?application
undapp
bereits Pakete sind (dh Sie haben bereits__init__.py
in beiden). Als Ergebnis der Zugabe__init__.py
auch zufolder
,application.app.folder
wird zu einem (Teil-) Paket , von dem Sie den Zugriff auf Modulapplication.app.folder.file
, dessen Symbolfunc_name
jetzt importiert werden kannWenn sich Module an parallelen Standorten befinden, wie in der Frage:
Diese Abkürzung macht ein Modul für das andere sichtbar:
quelle
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
cli/foo.py
von der Kommandozeile aus möglich warimport cli.bar
sys.path.append('.')
das Modul wahrscheinlich mit importierenfrom app2.some_folder.some_file import your_function
. Alternativ läuft das, was für mich funktioniert,python3 -m app2.another_folder.another_file
aus dem Stammordner.Erstes import sys in name-file.py
Zweitens hängen Sie den Ordnerpfad in name-file.py an
Drittens Erstellen Sie eine leere Datei mit dem Namen __ init __.py in Ihrem Unterverzeichnis (dies teilt Python mit, dass es sich um ein Paket handelt).
Viertens importieren Sie das Modul in den Ordner in name-file.py
quelle
sys.path.insert
. Daher bleibt die Antwort die Frage, ob diese Lösung auch dann funktioniert, wenn sich der Namensordner an einem beliebigen Ort befindet.Ich denke, ein Ad-hoc-Weg wäre die Verwendung der Umgebungsvariablen,
PYTHONPATH
wie in der Dokumentation beschrieben: Python2 , Python3quelle
Die Antworten hier sind unklar, dies wird auf Python 3.6 getestet
Mit dieser Ordnerstruktur:
Wo
myfile.py
hat der Inhalt:Die Importanweisung in
main.py
lautet:und das wird hallo drucken .
quelle
__init__.py
?__init__.py
funktioniert das Hinzufügen bei mir nicht. Ich benutze Py 3.6.5 unter Ubuntu 18. Es funktioniert auf Pycharm, aber nicht vom TerminalIhr Problem ist, dass Python im Python-Verzeichnis nach dieser Datei sucht und sie nicht findet. Sie müssen angeben, dass Sie über das Verzeichnis sprechen, in dem Sie sich befinden, und nicht über das Python-Verzeichnis.
Um dies zu tun, ändern Sie dies:
from application.app.folder.file import func_name
dazu:
Wenn Sie den Punkt hinzufügen, den Sie sagen, suchen Sie in diesem Ordner nach dem Anwendungsordner, anstatt im Python-Verzeichnis zu suchen.
quelle
Soweit ich weiß, fügen Sie eine
__init__.py
Datei direkt in den Ordner der Funktionen ein, die Sie importieren möchten.quelle
sys.path.append(tools_dir)
unter Windows verwendet und muss kein__init__.py' file in my directory
tools_dir` hinzufügenIn Python 3.4 und höher können Sie direkt aus einer Quelldatei importieren (Link zur Dokumentation) . Dies ist nicht die einfachste Lösung, aber der Vollständigkeit halber füge ich diese Antwort hinzu.
Hier ist ein Beispiel. Zunächst die zu importierende Datei mit dem Namen
foo.py
:Der Code, der die obige Datei importiert, ist stark vom Beispiel in der Dokumentation inspiriert:
Die Ausgabe:
Beachten Sie, dass der Variablenname, der Modulname und der Dateiname nicht übereinstimmen müssen. Dieser Code funktioniert immer noch:
Die Ausgabe:
Das programmgesteuerte Importieren von Modulen wurde in Python 3.1 eingeführt und bietet Ihnen mehr Kontrolle darüber, wie Module importiert werden. Weitere Informationen finden Sie in der Dokumentation.
quelle
Arbeitete für mich in Python3 unter Linux
quelle
sys.path.append("/home/linux/folder/")
-"~/folder/"
Probieren Sie die relativen Importe von Python aus:
Jeder führende Punkt ist eine weitere höhere Ebene in der Hierarchie, beginnend mit dem aktuellen Verzeichnis.
Probleme? Wenn dies bei Ihnen nicht funktioniert, werden Sie wahrscheinlich von den vielen relativen Importen von gotcha gebissen. Lesen Sie die Antworten und Kommentare, um weitere Informationen zu erhalten: So beheben Sie "Versuchter relativer Import in Nicht-Paketen" auch mit __init__.py
Hinweis: haben
__init__.py
auf jeder Verzeichnisebene. Möglicherweise benötigen Siepython -m application.app2.some_folder.some_file
(ohne .py), das Sie aus dem Verzeichnis der obersten Ebene ausführen, oder haben dieses Verzeichnis der obersten Ebene in Ihrem PYTHONPATH. Puh!quelle
Ich stand vor der gleichen Herausforderung, insbesondere beim Importieren mehrerer Dateien. Auf diese Weise konnte ich sie überwinden.
quelle
Betrachtet man
application
als Stammverzeichnis für Ihr Python - Projekt, erstellen Sie eine leere__init__.py
Datei inapplication
,app
undfolder
Ordner.some_file.py
Nehmen Sie dann wie folgt Änderungen vor, um die Definition von func_name zu erhalten:quelle
Die Verwendung von sys.path.append mit einem absoluten Pfad ist nicht ideal, wenn Sie die Anwendung in andere Umgebungen verschieben. Die Verwendung eines relativen Pfads funktioniert nicht immer, da das aktuelle Arbeitsverzeichnis davon abhängt, wie das Skript aufgerufen wurde.
Da die Struktur des Anwendungsordners festgelegt ist, können wir os.path verwenden, um den vollständigen Pfad des zu importierenden Moduls abzurufen. Wenn dies beispielsweise die Struktur ist:
Angenommen, Sie möchten das "Mango" -Modul importieren. In vanilla.py können Sie Folgendes tun:
Natürlich benötigen Sie die Variable mango_dir nicht.
Um zu verstehen, wie dies funktioniert, sehen Sie sich dieses interaktive Sitzungsbeispiel an:
Überprüfen Sie auch die Dokumentation zu os.path .
quelle
Das funktioniert bei mir unter Windows
quelle
Ich bin etwas ganz Besonderes: Ich benutze Python mit Windows!
Ich vervollständige nur die Informationen: Sowohl für Windows als auch für Linux funktionieren sowohl relative als auch absolute Pfade
sys.path
(ich benötige relative Pfade, da ich meine Skripte auf den verschiedenen PCs und unter verschiedenen Hauptverzeichnissen verwende).Und bei Verwendung von Windows beide
\
und/
können als Trennzeichen für Dateinamen verwendet werden und natürlich müssen Sie doppelt\
in Python - Strings,einige gültige Beispiele:
(Hinweis: Ich denke, das
/
ist bequemer als ein\
Ereignis, wenn es weniger "Windows-nativ" ist, weil es Linux-kompatibel und einfacher zu schreiben und in den Windows Explorer zu kopieren ist.)quelle
Wenn der Zweck des Ladens eines Moduls aus einem bestimmten Pfad darin besteht, Sie bei der Entwicklung eines benutzerdefinierten Moduls zu unterstützen, können Sie im selben Ordner des Testskripts einen symbolischen Link erstellen, der auf das Stammverzeichnis des benutzerdefinierten Moduls verweist. Diese Modulreferenz hat Vorrang vor allen anderen Modulen mit demselben Namen für alle in diesem Ordner ausgeführten Skripte.
Ich habe dies unter Linux getestet, aber es sollte in jedem modernen Betriebssystem funktionieren, das symbolische Links unterstützt.
Ein Vorteil dieses Ansatzes besteht darin, dass Sie auf ein Modul verweisen können, das sich in Ihrer eigenen lokalen SVC-Zweigarbeitskopie befindet. Dies kann die Entwicklungszykluszeit erheblich vereinfachen und die Fehlermodi bei der Verwaltung verschiedener Versionen des Moduls verringern.
quelle
In meinem Fall musste ich eine Klasse importieren. Meine Datei sah folgendermaßen aus:
In meine Hauptdatei habe ich den Code aufgenommen über:
quelle
Ich bin mehrmals auf dieselbe Frage gestoßen, daher möchte ich meine Lösung mitteilen.
Python-Version: 3.X.
Die folgende Lösung richtet sich an Personen, die Ihre Anwendung in Python Version 3.X entwickeln, da Python 2 seit dem 1. Januar 2020 nicht mehr unterstützt wird .
Projektstruktur
In Python 3 benötigen
__init__.py
Sie aufgrund der impliziten Namespace-Pakete kein Projekt-Unterverzeichnis . Siehe Ist init .py für Pakete in Python 3.3+ nicht erforderlich?Problemstellung
In
file_b.py
, würde Ich mag eine Klasse importieren ,A
infile_a.py
unter dem Ordner ein.Lösungen
# 1 Ein schneller, aber schmutziger Weg
Ohne das Paket zu installieren, wie Sie gerade ein neues Projekt entwickeln
Verwenden Sie die
try catch
, um zu überprüfen, ob die Fehler vorliegen. Codebeispiel:# 2 Installieren Sie Ihr Paket
Sobald Sie Ihre Anwendung installiert haben (in diesem Beitrag ist das Tutorial zur Installation nicht enthalten)
Sie können einfach
Viel Spaß beim Codieren!
quelle
Ich habe an einem Projekt gearbeitet
a
, über das Benutzerpip install a
mit der folgenden Dateiliste installieren sollen :setup.py
MANIFEST.in
a / init .py
a / a.py.
a / b / init .py
a / b / b.py.
Ich habe das Modul installiert, indem ich Folgendes aus dem Verzeichnis mit ausgeführt habe
MANIFEST.in
:Dann
/moustache/armwrestle
konnte ich von einem völlig anderen Ort in meinem Dateisystem aus Folgendes ausführen:Was bestätigte, dass
a.cats
tatsächlich gleich 0 unda.b.dogs
tatsächlich gleich 1 war, wie beabsichtigt.quelle
Anstatt nur eine zu
import ...
tun, tun Sie Folgendes:from <MySubFolder> import <MyFile>
MyFile befindet sich im MySubFolder.
quelle
Sie können die Python-Shell aktualisieren, indem Sie f5 drücken oder zu Run-> Run Module gehen. Auf diese Weise müssen Sie das Verzeichnis nicht ändern, um etwas aus der Datei zu lesen. Python ändert automatisch das Verzeichnis. Wenn Sie jedoch mit verschiedenen Dateien aus verschiedenen Verzeichnissen in der Python-Shell arbeiten möchten, können Sie das Verzeichnis in sys ändern, wie Cameron bereits sagte .
quelle
Also hatte ich einfach mit der rechten Maustaste auf meine IDE geklickt und eine neue hinzugefügt
folder
und mich gefragt, warum ich nicht in der Lage war, daraus zu importieren. Später wurde mir klar, dass ich mit der rechten Maustaste klicken und ein Python-Paket erstellen muss, und keinen klassischen Dateisystemordner. Oder eine Post-Mortem-Methode, bei der ein hinzugefügt wird__init__.py
(wodurch Python den Dateisystemordner als Paket behandelt), wie in anderen Antworten erwähnt. Fügen Sie diese Antwort hier hinzu, nur für den Fall, dass jemand diesen Weg gegangen ist.quelle
Mit importlib können Sie Module importieren, in die Sie ein Modul aus einem Ordner importieren möchten, indem Sie eine Zeichenfolge wie folgt verwenden:
Dieses Beispiel hat eine main.py, bei der es sich um den obigen Code handelt, dann einen Ordner namens Scripts. Anschließend können Sie in diesem Ordner alles aufrufen, was Sie benötigen, indem Sie die
scriptName
Variable ändern . Sie können dann verwenden,script
um auf dieses Modul zu verweisen. Wenn ich beispielsweise eine FunktionHello()
im Snake-Modul habe, können Sie diese Funktion folgendermaßen ausführen:Ich habe dies in Python 3.6 getestet
quelle
Ich hatte diese Probleme einige Male. Ich bin viel auf dieselbe Seite gekommen. In meinem letzten Problem musste ich das
server
aus einem festen Verzeichnis ausführen , aber beim Debuggen wollte ich aus verschiedenen Unterverzeichnissen ausführen.hat bei mir NICHT funktioniert, da ich in verschiedenen Modulen verschiedene * .csv- Dateien lesen musste, die sich alle im selben Verzeichnis befanden.
Am Ende war das, was für mich funktionierte, nicht pythonisch, aber:
Ich habe
if __main__
oben auf dem Modul, das ich debuggen wollte, ein Modul verwendet , das von einem anderen als dem üblichen Pfad ausgeführt wird.Damit:
quelle