Heim >Backend-Entwicklung >Python-Tutorial >Wie gehe ich mit relativen Importen in Python-Paketen um, wenn Module als Skripte ausgeführt werden?
Wenn Sie versuchen, eine Funktion aus einer anderen Datei im selben Verzeichnis zu importieren, verwenden Sie entweder from .mymodule import myfunction oder from mymodule import myfunction can zu Fehlern führen. Der Grund liegt darin, ob sich das Modul, das die zu importierende Funktion enthält, in einem Paket befindet oder nicht.
Relative Importe funktionieren, wenn sich das Modul in einem Paket befindet. Um ein Paket zu erstellen, muss eine __init__.py-Datei in dem Verzeichnis vorhanden sein, das die Module enthält. Es ist jedoch auch wichtig, sicherzustellen, dass das Modul manchmal als Skript ausgeführt werden kann.
Ein allgemeines Layout für ein Paket, das mehrere Module und ein Hauptskript enthält, ist wie folgt folgt:
mypackage/
Innerhalb 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()
In myothermodule.py:
# Import exported function from the mymodule from .mymodule import as_int # 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()
In main.py:
# Import exported function from myothermodule from mypackage.myothermodule import add def main(): print(add('1', '1')) if __name__ == '__main__': main()
Beim Ausführen von main.py oder mypackage/mymodule.py wird der Code ohne Probleme ausgeführt. Der Versuch, mypackage/myothermodule.py auszuführen, führt jedoch zu einem Fehler im Zusammenhang mit dem verwendeten relativen Import (von .mymodule import as_int).
Es gibt zwei alternative Ansätze, um dieses Problem zu beheben :
Das obige ist der detaillierte Inhalt vonWie gehe ich mit relativen Importen in Python-Paketen um, wenn Module als Skripte ausgeführt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!