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