Heim >Backend-Entwicklung >Python-Tutorial >Warum erhalte ich in Python die Meldung „Versuchter relativer Import in Nicht-Paket'?

Warum erhalte ich in Python die Meldung „Versuchter relativer Import in Nicht-Paket'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-21 13:31:09867Durchsuche

Why Do I Get

Relative Importe in Python

Der häufige Fehler „Versuchter relativer Import in Nicht-Paket“ tritt häufig auf, wenn mit relativen Importen in gearbeitet wird Python. Ziel dieses Artikels ist es, das Konzept relativer Importe zu klären und Lösungen zur Behebung dieses Fehlers bereitzustellen.

Unterschied zwischen Skripten und Modulen

Der Hauptunterschied liegt in der Art und Weise, wie Python-Dateien sind geladen. Eine Datei, die direkt mit Python myfile.py ausgeführt wird, wird als Skript der obersten Ebene betrachtet. Umgekehrt ist eine Datei, die mithilfe einer Importanweisung in eine andere Datei importiert wird, ein Modul. Diese Unterscheidung ist entscheidend für das Verständnis relativer Importe.

Wichtigkeit der Benennung

Beim Laden wird jeder Datei ein Name zugewiesen, der im Attribut name gespeichert ist . Wenn es als Skript geladen wird, wird sein Name auf __main__ gesetzt. Wenn es als Modul importiert wird, spiegelt sein Name sowohl das Paket wider, zu dem es gehört, als auch den Dateinamen.

Zum Beispiel in der bereitgestellten Verzeichnisstruktur:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

Beim Importieren von ModulX wird ihm der Name zugewiesen package.subpackage1.moduleX, während der Import von moduleA zum Namen package.moduleA führt. Wenn Sie jedoch eines der Module direkt ausführen, wird dessen Name auf __main__ gesetzt, wodurch die Paketinformationen unterdrückt werden.

Relative Importe

Relative Importe navigieren mithilfe von Pakethierarchien der Name eines Moduls. Beispielsweise zeigt from .. import foo eine Bewegung nach oben in der Hierarchie an. Für die Verwendung von „from .. import“ für „ascenden“ muss der Name eines Moduls ausreichend Punkte enthalten.

Nicht-Paket-Module

Module, deren Name keine Punkte enthält, werden jedoch nicht als Teil davon betrachtet ein Paket. Daher schlagen relative Importe mit dem Nicht-Paket-Fehler in solchen Modulen fehl.

Lösungen

Um den Fehler zu beheben, ziehen Sie die folgenden Lösungen in Betracht:

  1. Module als Pakete ausführen: Verwenden Sie python -m package.subpackage1.moduleX, um ein zu laden Modul, ohne es als Skript auszuführen.
  2. Ausführung vom Import trennen: Skripte außerhalb des Paketverzeichnisses ausführen und Module daraus importieren, um relative Importe zu ermöglichen.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich in Python die Meldung „Versuchter relativer Import in Nicht-Paket'?. 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