Früher oder später wird einem eine Python-Datei begegnen, die folgenden Code enthält:
def main():
pass
if __name__ == 'main':
main()
Es stellt sich die Frage: Was hat es damit auf sich? Zur Beantwortung dieser Frage betrachten wir die Zeile if __name__ == 'main'
. Bei __name__
handelt es sich um eine Variable. Dieser Variable ist der Wert main
zugewiesen:
>>> print(__name__)
__main__
Dies gilt immer dann, wenn eine Python-Datei direkt ausgeführt wird. Wird eine Datei hingegen importiert, wird der Wert main
nicht der Variable __name__
zugewiesen. Stattdessen wird __name__
der Name des Moduls (also der Dateiname) zugewiesen. Folgendes Beispiel soll dies verdeutlichen:
Eine Datei mit der Behzeichnung a.py
enthält folgende Code-Zeile:
print(__name__)
Eine zweite Datei mit der Bezeichnung b.py
importiert das Modul a.py
:
import a
Die Datei b.py
enthält lediglich die Zeile import a
. Dies führt dazu, dass die in der Datei a.py
enthaltene Zeile print(__name__)
ausgeführt wird, was wiederum zur Ausgabe von a
führt:
$ python3 b.py
a
Dies zeigt also: Wird ein Modul importiert (hier: a.py
), dann erhält dieses Modul den Namen dieser Datei (hier: a
). Wird das Modul a.py
aber direkt ausgeführt, erhält es den Namen __main__:
$ python3 a.py
__main__
Dieses Wissen lässt sich nutzen, und zwar durch die Abfrage, ob ein Modul direkt ausgeführt wird, mithin durch die Zeile:
if __name__ = 'main':
Erweitern wir jetzt die Datei a.py
um folgenden Code:
def main():
print('Dieses Modul wird direkt ausgeführt')
if __name__ == 'main':
main()
Die Ausführung von python3 b.py
führt dazu, dass nichts ausgegeben wird, denn das Modul a.py
wird importiert. Anders verhält es sich wiederum wenn wir a.py
ausführen:
$ python3 a.py
Dieses Modul wird direkt ausgeführt
Als Fazit kann man sich also merken:
Möchte man sichergehen, dass Code nur dann ausgeführt wird, wenn eine Datei direkt ausgeführt wird, dann fügt man eine entsprechende if
-Abfrage hinzu:
if __name__ == 'main':
main()
In diesem Beispiel wird dann die Funktion main()
aufgerufen. Bei einem nicht direkten Aufruf (sondern über einen Import) wird hingegen nicht main()
aufgerufen (eventuell aber anderer in dieser Datei enthaltene Code).
Anders gesagt: Mit if __name__ == 'main':
kann man steuern, welcher Code bei einem direkten Aufruf bzw. bei einem Import ausgeführt werden soll.
Zuletzt aktualisiert am 23. Juni 2023