Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich den Fehler „Versuchter relativer Import in Nicht-Paket' in Python beheben?

Wie kann ich den Fehler „Versuchter relativer Import in Nicht-Paket' in Python beheben?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 02:21:15200Durchsuche

How Can I Solve

Relative Importe in Python: Ein umfassender Leitfaden

Das Problem: Module über Unterpakete hinweg importieren

Stellen Sie sich die folgende Verzeichnisstruktur vor:

app/
   __init__.py
   sub1/
      __init__.py
      mod1.py
   sub2/
      __init__.py
      mod2.py

Um etwas aus Mod2 innerhalb des Moduls Mod1 zu importieren, wurde der folgende Code verwendet versucht:

from ..sub2 import mod2

Dies führt jedoch zu dem Fehler: „Versuchter relativer Import in Nicht-Paket.“

Die Lösung: Deklariertes Paket

Der Fehler tritt auf, weil Indem Python das Modul als __main__ ausführt und das Argument mod1.py an den Interpreter übergibt, behandelt es es als Modul der obersten Ebene und ignoriert das Paket Informationen.

Um dieses Problem zu beheben, müssen die Dateien __init__.py sowohl im sub1- als auch im sub2-Verzeichnis ordnungsgemäß initialisiert werden. Dies bedeutet, dass es sich bei diesen Verzeichnissen tatsächlich um Pakete handelt und wir mithilfe relativer Importe über sie hinweg importieren können.

Wenn die Dateien __init__.py vorhanden sind, importiert der folgende Code erfolgreich Mod2 in Mod1:

from ..sub2 import mod2

Relative Importe und PEP 366

PEP 366 schlägt einen Mechanismus zum Referenzieren von Modulen relativ zu vor Hauptmodul. In Python 2.6 und späteren Versionen können Sie Module relativ zum Hauptmodul mithilfe der folgenden Syntax importieren:

from . import mod2
from .. import sub2

Dieses Verhalten stimmt mit der erwarteten Funktionalität für Unterpaketimporte überein und gewährleistet einen konsistenten und intuitiven Importmechanismus.

Das obige ist der detaillierte Inhalt vonWie kann ich den Fehler „Versuchter relativer Import in Nicht-Paket' in Python beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn