Was bedeutet if __name__ == ‚__main__‘?

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