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
Mary-Kate OlsenOriginal
2024-12-27 14:49:171022Durchsuche

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

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()
  • 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()
  • main.py
from mypackage.myothermodule import add

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

if __name__ == '__main__':
    main()

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

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

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

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

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!

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