Heim > Backend-Entwicklung > Python-Tutorial > Warum schlagen relative Importe in Python 3 fehl und wie kann ich sie beheben?

Warum schlagen relative Importe in Python 3 fehl und wie kann ich sie beheben?

Mary-Kate Olsen
Freigeben: 2024-12-27 14:49:17
Original
972 Leute haben es durchsucht

Why Do Relative Imports in Python 3 Fail, and How Can I Fix Them?

Relative Importe in Python 3: Die mysteriösen Fehler

In Python 3 sind relative Importe eine bequeme Möglichkeit, Module aus demselben heraus zu importieren Verzeichnis. Allerdings tritt häufig ein unerwarteter Fehler auf:

Fehlermeldungen:

  • ImportError: versuchter relativer Import ohne bekanntes übergeordnetes Paket
  • ModuleNotFoundError: Kein Modul mit dem Namen „mymodule“
  • SystemError: Parent module '' nicht geladen, Relativer Import kann nicht durchgeführt werden

Die Grundursache:

Um diese Fehler zu verstehen, müssen wir uns mit dem Modulimportmechanismus von Python befassen. Relative Importe erfordern, dass das importierende Modul in einem Paket enthalten ist. Ein Paket ist ein Verzeichnis, das durch das Vorhandensein einer __init__.py-Datei als Paket gekennzeichnet ist.

Gemeinsames Layout:

Pakete haben häufig die folgende Struktur:

main.py
mypackage/
    __init__.py
    mymodule.py
    myothermodule.py
Nach dem Login kopieren

Beispiel Code:

  • mymodule.py
# Exported function
def as_int(a):
    return int(a)

# Test function for module  
def _test():
    assert as_int('1') == 1

if __name__ == '__main__':
    _test()
Nach dem Login kopieren
  • myothermodule.py
# Exported function
def add(a, b):
    return as_int(a) + as_int(b)

# Test function for module  
def _test():
    assert add('1', '1') == 2

if __name__ == '__main__':
    _test()
Nach dem Login kopieren
  • main.py
from mypackage.myothermodule import add

def main():
    print(add('1', '1'))

if __name__ == '__main__':
    main()
Nach dem Login kopieren

Wenn Sie main.py ausführen oder mypackage/mymodule.py, alles funktioniert reibungslos. Das Ausführen von mypackage/myothermodule.py schlägt jedoch aufgrund des relativen Imports fehl:

from .mymodule import as_int
Nach dem Login kopieren

Die Lösung:

Wie Guido van Rossum erklärt, liegt dieser Fehler an Python behandelt laufende Skripte innerhalb eines Pakets als Antimuster. Die empfohlene Lösung besteht darin, relative Importe zu vermeiden und stattdessen absolute Importe zu verwenden:

from mypackage.mymodule import as_int
Nach dem Login kopieren

Alternative Ansätze:

Wenn Sie immer noch relative Importe bevorzugen, können Sie Folgendes verwenden: m-Option, um das zu importierende Modul anzugeben, aber es kann ausführlich und unpraktisch sein:

python3 -m mypackage.myothermodule
Nach dem Login kopieren

Eine andere Alternative ist die Manipulation PYTHONPATH, um das übergeordnete Verzeichnis des Pakets einzuschließen:

import sys
import os

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(SCRIPT_DIR))

from mypackage.mymodule import as_int
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum schlagen relative Importe in Python 3 fehl und wie kann ich sie beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage