1089 Stimmen

Importieren von Modulen aus dem übergeordneten Ordner

Ich verwende Python 2.5.

Dies ist mein Ordnerbaum:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(Ich habe auch __init__.py in jedem Ordner, hier aus Gründen der Lesbarkeit weggelassen)

Wie importiere ich die nib Modul aus dem Inneren des life Modul? Ich hoffe, dass es möglich ist, ohne an sys.path herumzubasteln.

Hinweis: Das Hauptmodul, das ausgeführt wird, befindet sich in der ptdraft Ordner.

1 Stimmen

Wie ist Ihr PYTHONPATH eingestellt?

2 Stimmen

Ross: Ich habe es mir angesehen. Was soll ich dagegen tun? Ich habe bereits eine __init__.py . S.Lott: Ich weiß nicht, wie ich das überprüfen kann...

4 Stimmen

Echo $PYTHONPATH aus der Shell; import sys; print sys.path aus Python heraus. docs.python.org/tutorial/

12voto

tjk Punkte 179

Obwohl der ursprüngliche Autor wahrscheinlich nicht mehr auf der Suche nach einer Lösung ist, aber der Vollständigkeit halber, hier eine einfache Lösung. Es ist zu laufen Leben.py als ein Modul wie dieses:

cd ptdraft
python -m simulations.life.life

Auf diese Weise können Sie alles aus nib.py como ptdraft Verzeichnis im Pfad ist.

0 Stimmen

Dies ist ein großartiger Ansatz für diejenigen, die es nicht vermasseln wollen sys.path oder Umgebungsvariablen wie PYTHONPATH für weitere Informationen über -m können Sie sich dieser Stackoverflow-Thread

0 Stimmen

Wenn Sie vscode verwenden, können Sie dies automatisch mit der Konfiguration unter stackoverflow.com/questions/57455652/ .

11voto

zviad Punkte 580

Für mich ist der kürzeste und von mir bevorzugte Oneliner für den Zugriff auf das übergeordnete Verzeichnis:

sys.path.append(os.path.dirname(os.getcwd()))

oder:

sys.path.insert(1, os.path.dirname(os.getcwd()))

os.getcwd() gibt den Namen des aktuellen Arbeitsverzeichnisses zurück, os.path.dirname(directory_name) gibt den Verzeichnisnamen für das übergebene Verzeichnis zurück.

Eigentlich, meiner Meinung nach Python-Projekt-Architektur sollte die Art und Weise, wo kein ein Modul aus Kind-Verzeichnis wird jedes Modul aus dem übergeordneten Verzeichnis verwenden getan werden. Wenn so etwas passiert, lohnt es sich, den Projektbaum zu überdenken.

Eine andere Möglichkeit ist, das übergeordnete Verzeichnis in die Systemumgebungsvariable PYTHONPATH aufzunehmen.

2 Stimmen

+1 für die Erwähnung der Möglichkeit, dass das Projekt umstrukturiert werden muss (im Gegensatz zu einem Hack, der das Problem löst)

1 Stimmen

Wird nicht das Elternteil, sondern das aktuelle

0 Stimmen

Dies ist eine schlechte Idee, da es vom aktuellen Verzeichnis und nicht vom Speicherort der Datei abhängt und daher je nachdem, von wo aus Sie das Skript ausführen, unterschiedliche Dinge tun wird.

11voto

Andong Zhan Punkte 10430

import sys sys.path.append('../')

11 Stimmen

Dies funktioniert nicht, wenn es von einem anderen Verzeichnis aus ausgeführt wird.

6voto

Erel Segal-Halevi Punkte 29656

In einem Linux-System können Sie einen Softlink vom Ordner "life" zur Datei nib.py erstellen. Dann können Sie sie einfach wie folgt importieren:

import nib

1 Stimmen

Diese Antwort verdient mehr Aufmerksamkeit. symlinks Ansatz ist um Größenordnungen sauberer als die meisten Antworten in diesem Thread. dennoch ist dies das erste Mal, dass ich sehe, dass jemand es vorschlägt.

4 Stimmen

Ich bin anderer Meinung. Dies ist eine nicht portierbare Lösung, die außerdem die Dateisystemebene mit Python-Quellcode vermischt.

6voto

YFP Punkte 331

Im gleichen Stil wie die letzte Antwort - aber in weniger Zeilen :P

import os,sys
parentdir = os.path.dirname(__file__)
sys.path.insert(0,parentdir)

Datei gibt den Ort zurück, an dem Sie gerade arbeiten

0 Stimmen

Für mich Datei ist der Dateiname ohne den Weg eingeschlossen. Ich führe es mit "ipy filename.py" aus.

0 Stimmen

Hallo @CurtisYallop im obigen Beispiel fügen wir das Verzeichnis hinzu, das die Datei enthält [in der wir uns gerade befinden], in der sich die Python-Datei befindet. Der os.path.dirname Aufruf mit dem Dateinamen sollte den Pfad der Datei zurückgeben und wir fügen DAS zum Pfad hinzu und nicht explizit die Datei - HTH's :-)

0 Stimmen

Sie gehen davon aus, dass __file__ immer den Pfad plus die Datei enthält. Manchmal enthält es nur den Dateinamen ohne den Pfad.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X