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/

33voto

Thomas R Punkte 633

In einem Jupyter Notebook (geöffnet mit Jupyter LAB oder Jupyter Notebook)

Solange Sie in einem Jupyter Notebook arbeiten, könnte diese kurze Lösung nützlich sein:

%cd ..
import nib

Es funktioniert auch ohne __init__.py Datei.

Ich habe es mit Anaconda3 unter Linux und Windows 7 getestet.

9 Stimmen

Wäre es nicht sinnvoll, Folgendes hinzuzufügen %cd - nach dem Import, so dass das aktuelle Verzeichnis des Notizbuchs unverändert bleibt.

1 Stimmen

Dies ist besonders hilfreich, wenn Sie Module importieren müssen, die auch andere Module mit relativen Pfaden importieren.

25voto

Yu N. Punkte 1065

Ich habe herausgefunden, dass die folgende Methode funktioniert, um ein Paket aus dem übergeordneten Verzeichnis des Skripts zu importieren. Im Beispiel möchte ich die Funktionen in env.py de app.db Paket.

.
 my_application
     alembic
         env.py
     app
         __init__.py
         db

import os
import sys
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir)

1 Stimmen

Also, ein netter Einzeiler: sys.path.append(os.path.dirname(os.path.dirname(os.path.real‌​path(__file__))))

1 Stimmen

Ändern von sys.path ist in der Regel eine schlechte Idee. Sie brauchen eine Möglichkeit ( z.B.. , PYTHONPATH ), damit Ihre Bibliothek zugänglich ist für andere Code (sonst ist es nicht wirklich eine Bibliothek); verwenden Sie das einfach immer!

18voto

Ravin Gupta Punkte 755

Die oben genannten Lösungen sind auch in Ordnung. Eine andere Lösung für dieses Problem ist

Wenn Sie etwas aus dem übergeordneten Verzeichnis importieren möchten. dann,

from ...module_name import *

Auch wenn Sie ein Modul aus dem übergeordneten Verzeichnis importieren möchten. dann,

from ..module_name import *

Auch wenn Sie ein Modul aus dem übergeordneten Verzeichnis importieren möchten. dann,

from ...module_name.another_module import *

Auf diese Weise können Sie jede beliebige Methode importieren, wenn Sie dies wünschen.

16 Stimmen

Dies scheint so zu sein, wie es sein sollte, aber aus irgendeinem Grund funktioniert dies nicht auf die gleiche Weise wie die sys.path.append Hacks oben und ich kann meine Lib nicht so importieren. Dies ist, was ich zuerst versucht zu tun, bevor Sie zu googeln :) Ok, es war dies ValueError: attempted relative import beyond top-level package

1 Stimmen

Ich habe einige Tests durchgeführt und es scheint, dass from ... import name bedeutet nicht "import name from top-level", sondern "import name from the parent's parent". Ich habe eine verschachtelte Verzeichnisstruktur erstellt a1/.../a9 von neun Verzeichnissen, von denen jedes ein __init__.py Importieren des nächsten Verzeichnisses mit from . import next_dir . Das letzte Verzeichnis enthielt eine Datei mit from ....... import b die dann importiert a1/a2/a3/b . (getestet mit Python 3.8.2)

0 Stimmen

Wir haben diese Lösung für unsere Bibliothekstests verwendet. Die akzeptierte Antwort ist in der Tat ein richtiger Weg, die Dinge zu tun, aber wenn ich richtig verstehe, würde das erfordern, die Module freizulegen, die wir nicht wollen

17voto

Vinoj John Hosan Punkte 5450

Einfachste Lösung mit zwei Zeilen

import os, sys
sys.path.insert(0, os.getcwd()) 

Wenn das übergeordnete Verzeichnis Ihr Arbeitsverzeichnis ist und Sie von untergeordneten Skripten aus ein anderes untergeordnetes Modul aufrufen möchten.

Sie können alle untergeordneten Module aus dem übergeordneten Verzeichnis in beliebige Skripte importieren und diese als

python child_module1/child_script.py

2 Stimmen

Dies ist die einzige Methode, die bei mir funktioniert hat und für meinen Anwendungsfall am besten geeignet ist: Importieren der Hauptmethode aus einem Ordner mit Tests

13voto

Gin Punkte 261

Ich denke, Sie können dies in diesem speziellen Beispiel versuchen, aber in Python 3.6.3 enter image description here

0 Stimmen

OK, Sie können auf diesen Link klicken, um import_cas herunterzuladen und den Quellcode zu überprüfen fall_repo

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