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:
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:
# Exported function def as_int(a): return int(a) # Test function for module def _test(): assert as_int('1') == 1 if __name__ == '__main__': _test()
# 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()
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!