Lösen Sie versuchten relativen Import ohne bekanntes übergeordnetes Paket in Python

Olorunfemi Akinlua 21 Juni 2023
Lösen Sie versuchten relativen Import ohne bekanntes übergeordnetes Paket in Python

Relative Importe in Python können schwierig sein, insbesondere wenn es um mehrere Module in einem einzigen Verzeichnis geht. Je nachdem, wie Sie Ihre Python-Codebasis gestalten, kann es zu einem ImportError kommen.

Ein gutes Verständnis des Importsystems reicht jedoch aus, um solche Fehler zu vermeiden, einschließlich des ImportError: versuchte relativer Import ohne bekanntes übergeordnetes Paket. Die Fehlermeldung erleichtert die Fehlersuche, woher das Problem stammen könnte.

In diesem Fall liegt es daran, dass das übergeordnete Paket nicht vorhanden ist. Dieser Artikel zeigt und erklärt, wie das Problem ImportError gelöst werden kann.

Verwenden Sie submodules, um den ImportError: versuchte relativer Import ohne bekanntes übergeordnetes Paket in Python zu lösen

Der Fehler ImportError: versuchte relativer Import ohne bekanntes übergeordnetes Paket entsteht, wenn wir den Ausdruck .module_name wie im folgenden Code verwenden.

import .module_name

Lassen Sie uns das Problem replizieren, indem wir drei Dateien in einem neuen Verzeichnis erstellen. Sie können die folgende Struktur verwenden, um es auszuprobieren.

Das Verzeichnis IError enthält den gesamten Python-Code, und das Verzeichnis myPackage enthält alle Paketdateien. Dann greift die [main.py] auf die myPackage.py zu.

IError/
    myPackage/
        __init__.py
        myNewPackage.py
    main.py

Um die Fehlermeldung nachzustellen, benötigen wir lediglich die Datei __init__.py. Die Datei __init__.py teilt dem Python-Interpreter mit, dass ein Verzeichnis Python-Modulcode enthält, in diesem Fall myNewPackage.py.

Bevor wir den Fehler reproduzieren, schreiben wir den Code, der in allen drei Python-Dateien enthalten sein wird.

In der Datei myNewPackage.py ist das folgende Code-Snippet vorhanden:

def createSingleDict(name, value):
    return {"name": name, "value": value}

Die Datei __init__.py:

from .myNewPackage import createSingleDict

Die Datei main.py, die das Modul myPackage verwendet:

import myPackage as pkg

User = pkg.createSingleDict("Jacob", 25)

print(User)

Die myNewPackage.py enthält eine einzelne Funktion, die zwei Argumente akzeptiert und ein Wörterbuch mit den übergebenen Argumenten zurückgibt. Die __init__.py verwendet die import-Anweisung und die Schlüsselwörter from und import, um die myNewPackage.py in die __init__.py-Datei zu importieren.

Die main.py importiert das myPackage ohne den Ausdruck myPackage.myNewPackage zu verwenden. All dies ist durch Untermodule möglich.

Die Datei __init__.py und die darin enthaltene Anweisung laden den Submodulmechanismus, bei dem die Datei myNewPackage (Attribut) an den übergeordneten Namensraum (myPackage) gebunden ist.

Der Schlüsselteil der Anweisung innerhalb der Datei __init__.py ist der Punkt vor dem Modulnamen. Dies ermöglicht die Bindung an das platzierte Modul des übergeordneten Moduls.

Denken Sie an den Teil der Fehlermeldung ohne bekanntes übergeordnetes Paket. Aus diesem Grund tritt der Fehler auf.

Lassen Sie uns nur die Datei __init__.py ausführen. Die Ausgabe der Ausführung ist unten.

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\IError\myPackage\__init__.py", line 1, in <module>
    from .myNewPackage import createSingleDict
ImportError: attempted relative import with no known parent package

Dieser Fehler tritt auf, weil wir die Datei __init__.py ohne den Kontext des übergeordneten Namensraums myPackage ausführen. Wenn wir jedoch main.py mit der import-Anweisung import myPackage as pkg ausführen, werden wir keine Fehler haben.

Die Ausgabe ist unten zu sehen:

{'name': 'Jacob', 'value': 25}

Verwenden Sie daher nicht das . Operator vor dem module_name, es sei denn innerhalb der __init__.py oder der Bindung oder dem Kontext eines übergeordneten Namensraums, um den ImportError: versuchte relativer Import ohne bekanntes übergeordnetes Paket zu verhindern.

Um besser zu verstehen, was vor sich geht, entfernen Sie das . Operator innerhalb der import-Anweisung in __init__.py, werden wir keine Fehler beim Ausführen der Datei haben.

from myNewPackage import createSingleDict

Wenn wir jedoch die Datei main.py ausführen, wird dies den folgenden Fehler verursachen, da wir das Modul myNewPackage nicht an das übergeordnete Modul myPackage gebunden haben.

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\IError\tempCodeRunnerFile.py", line 1, in <module>
    import myPackage as pkg
  File "c:\Users\akinl\Documents\IError\myPackage\__init__.py", line 1, in <module>
    from myNewPackage import createSingleDict
ModuleNotFoundError: No module named 'myNewPackage'

Um den Code auszuführen, müssen wir das . verwenden. Operator innerhalb der import-Anweisung in main.py und entfernen (löschen) Sie die __init__.py-Datei.

import myPackage.myNewPackage as pkg

User = pkg.createSingleDict("Jacob", 25)

print(User)

Dies ist jedoch umständlich und sinnvoller ist es, Ihre Untermodule mit dem . an das übergeordnete Modul zu binden. -Operator innerhalb von __init__.py, aber stellen Sie immer sicher, dass Sie ihn im übergeordneten Kontext ausführen.

Wenn Sie zwei Submodule haben, funktioniert es genauso. Die neuen Untermodule otherPackage.py können den folgenden Code enthalten:

def printName(name):
    print("The user's name is " + name)

Sie aktualisieren die Datei __init__.py, um das neue Submodul an den übergeordneten Namensraum zu binden.

from .myNewPackage import createSingleDict
from .otherPackage import printName

Und innerhalb der main.py müssen Sie den Alias pkg verwenden, um auf die Funktion innerhalb des anderen Submoduls zuzugreifen. Das ist das Schöne an der Bindung an den übergeordneten Namensraum, die Einfachheit des Imports.

import myPackage as pkg

User = pkg.createSingleDict("Jacob", 25)

print(User)
pkg.printName("Jacob")

Die Ausgabe des Codes:

{'name': 'Jacob', 'value': 25}
The user's name is Jacob

Mit all diesen haben Sie alle erforderlichen Informationen, um den ImportError: versuchte relativer Import ohne bekanntes übergeordnetes Paket in Ihrer Python-Codebasis zu verhindern oder zu lösen.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Verwandter Artikel - Python Error