if __name__ == "__main__":

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
zenker
User
Beiträge: 19
Registriert: Dienstag 25. August 2009, 17:04

Hi,

in diversen Codes lese ich häufiger folgendes Konstrukt:

Code: Alles auswählen

if __name__ == "__main__":
    main()
welchen tiefergehenden Sinn hat das?
Gut, "main()" ist eine Prozedur.
Aber welchen Sinn hat das "if __name..."?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Wenn das aktuelle Modul das "Hauptmodul" ist, d.h. direkt von einem Python-Interpreter gestarted und nicht von einem anderen Modul importiert wurde, dann ist `__name__` = "__main__". Im Prinzip heißt `if __name__ == '__main__':` `wenn dieses modul das hauptmodul ist:`.

Gruß
lunar

"__name__" enthält normalerweise den Namen des aktuellen Moduls. Wird dieses Modul jedoch ausgeführt und nicht importiert (z.B. über "python foo.py"), so setzt der Interpreter "__name__" auf den magischen Wert "__main__".

Dadurch kann man im Modul erkennen, ob das Modul importiert oder ausgeführt wird. So kann man beispielsweise Skripte schreiben, die man auch importieren kann (z.B. für automatisiertes Testing), oder Module, die man ausführen kann (z.B. damit das Modul sich selbst testen).

In der Standardbibliothek sieht man diesen Trick beispielsweise im "webbrowser"-Modul.
zenker
User
Beiträge: 19
Registriert: Dienstag 25. August 2009, 17:04

Ahso, also kann ich dann mit if...elif... dann steuern, was passieren soll wenn das Programm von einem anderen Programm aufgerufen wird!?!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nun ``__name__`` ist fuer jedes Modul definiert, fuer den Fall, dass es das Hauptmodul ist, ist der Name eben "__main__", andernfalls ist es der Dateiname des Moduls.

Das Idiom dient einfach dazu, bestimmten Code nur dann auszufuehren, wenn das Modul direkt ausgefuehrt wurde, um die Objekte darin auch fuer andere Module ohne Nebeneffekte nutzbar zu machen.
Antworten