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 können wir damit festhalten: Möchte man sichergehen, dass Code nur dann ausgeführt wird, wenn ein Modul 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 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.