Heim >Backend-Entwicklung >Python-Tutorial >Wie gehe ich mit relativen Importen in Python-Paketen um, wenn Module als Skripte ausgeführt werden?

Wie gehe ich mit relativen Importen in Python-Paketen um, wenn Module als Skripte ausgeführt werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-29 15:25:11807Durchsuche

How to Handle Relative Imports in Python Packages When Running Modules as Scripts?

Relative Importe in Python 3

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 verwenden

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.

Codestruktur

Ein allgemeines Layout für ein Paket, das mehrere Module und ein Hauptskript enthält, ist wie folgt folgt:

  • main.py
  • mypackage/

    • __init__. py
    • mymodule.py
    • myothermodule.py

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()

Ausführen des Codes

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).

Alternative Ansätze

Es gibt zwei alternative Ansätze, um dieses Problem zu beheben :

  1. Absolute Importe verwenden: Ersetzen Sie den relativen Import durch einen absoluten Import durch Angabe des vollständigen Modulpfads: from mypackage.mymodule import as_int. Dies erfordert jedoch, dass das übergeordnete Verzeichnis des Pakets zum PYTHONPATH hinzugefügt wird.
  2. Verwenden Sie die Option -m: Um die Verwendung absoluter Importe zu vermeiden und gleichzeitig sicherzustellen, dass das Modul ordnungsgemäß ausgeführt wird, verwenden Sie die Option - m-Option mit Python: python3 -m mypackage.myothermodule. Dieser Ansatz erfordert die Ausführung des Befehls aus dem übergeordneten Verzeichnis des Pakets.

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!

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