HOWTO · Python

Wie man den Fehler ImportError: Cannot Import Name in Python behebt

Diagnostizieren Sie Pythons ImportError: cannot import name, indem Sie Namen, Modulpfade, Shadowing, Versionen und zirkuläre Importe überprüfen, und folgen Sie dann einer gezielten Zwei-Module-Reparatur.

Auf dieser Seite

ImportError: cannot import name bedeutet, dass Python ein Modul gefunden hat, den angeforderten Namen daraus aber nicht erhalten konnte. Ein zirkulärer Import ist eine mögliche Ursache: Während Python ein Modul initialisiert, kann ein anderes Modul einen Namen anfordern, der noch nicht gebunden ist. Rechtschreibfehler, ein anderes Modul als erwartet, Shadowing durch eine lokale Datei, eine nicht verfügbare Abhängigkeit oder eine nicht übereinstimmende Paket-/API-Version können ähnliche Symptome hervorrufen. (demo1_func1; demo2_func1; demo2_func2)

Ursache des Fehlers ImportError: cannot import name in Python

Betrachten Sie demo1.py und demo2.py. Wenn jede Datei auf Modulebene from other_module import function verwendet, startet der Import einer Datei den anderen Import, bevor die Initialisierung abgeschlossen ist. Insbesondere existiert eine angeforderte Funktion möglicherweise noch nicht, wenn das zweite Modul sie anfordert. Python führt Anweisungen auf Modulebene als Teil des Importierens aus; es wartet nicht darauf, dass eine Funktion später erscheint.

Grenzen Sie die Ursache mithilfe des Tracebacks und des Importkontexts ein:

  1. Lesen Sie den vollständigen Traceback, um das Modul und den Namen zu identifizieren, den Python nicht importieren konnte.
  2. Überprüfen Sie, ob Schreibweise und Groß-/Kleinschreibung mit einer Definition in diesem Modul übereinstimmen.
  3. Stellen Sie fest, welche Datei Python auflöst: Eine nahe gelegene Datei, die nach einem Standardbibliotheksmodul oder einer Abhängigkeit benannt ist, kann das vorgesehene Modul überschatten.
  4. Überprüfen Sie, ob das Paket in der aktiven Umgebung installiert ist und ob seine Version die von Ihrem Code erwartete API bereitstellt.
  5. Wenn Namen und Pfade korrekt sind, verfolgen Sie die Importe auf Modulebene in beiden Richtungen, um einen Zyklus zu finden.

Der genaue Wortlaut nach dem Namen variiert je nach Python-Version und Importkontext; diagnostizieren Sie daher anhand des Tracebacks und des Modulcodes, statt sich auf ein festes Suffix zu verlassen.

Beheben des Fehlers ImportError: cannot import name in Python

Importieren Sie in diesem Zwei-Module-Fall die Module und schlagen Sie deren Attribute nach, wenn die Funktionen laufen. Dadurch wird die Namensauflösung verschoben, bis beide Module vollständig importiert sind. Das folgende eigenständige Beispiel erstellt demo1.py und demo2.py in einem temporären Verzeichnis und führt dann demo2.py aus:

from pathlib import Path
import subprocess
import sys
import tempfile

demo1_source = '''import demo2

def demo1_func1():
    print("demo1_func1")
    demo2.demo2_func2()
'''

demo2_source = '''import demo1

def demo2_func1():
    print("demo2_func1")
    demo1.demo1_func1()

def demo2_func2():
    print("demo2_func2")

if __name__ == "__main__":
    demo2_func1()
'''

with tempfile.TemporaryDirectory() as directory:
    Path(directory, "demo1.py").write_text(demo1_source, encoding="utf-8")
    Path(directory, "demo2.py").write_text(demo2_source, encoding="utf-8")
    result = subprocess.run(
        [sys.executable, "demo2.py"],
        cwd=directory,
        text=True,
        capture_output=True,
        check=True,
    )
    print(result.stdout, end="")
demo2_func1
demo1_func1
demo2_func2

Die Änderung auf Modulimporte behebt den dargestellten Zyklus; sie ist keine universelle Lösung. Je nach Abhängigkeitsstruktur kann ein klarerer Entwurf gemeinsame Funktionen in ein drittes Modul verschieben oder einen Import in eine Funktion verlegen, wobei Letzteres Abhängigkeiten auf Modulebene weniger sichtbar macht. Flask-Anwendungen, die Blueprints verwenden, können beim Organisieren der Anwendungsimporte auch von diesem Flask-Blueprint-Leitfaden profitieren.