2008-11-13 21 views
14

Soll ich ein Python-Programm starten mit:Python-Programm starten

if__name__ == '__main__': 
some code... 

Und wenn ja, warum? Ich habe es oft gesehen, habe aber keine Ahnung davon.

+0

@Kirill Titov: Bitte bearbeiten Sie die Frage nicht, um "Closed" zu sagen. Es ist nicht geschlossen. Sie haben eine Antwort gewählt - das ist perfekt und alles, was Sie jemals tun müssen. Mehr zu tun ist verwirrend. –

Antwort

23

Wenn Ihr Programm als Bibliothek verwendbar ist, Sie aber auch über ein Hauptprogramm verfügen (z. B. um die Bibliothek zu testen), können andere die Datei als Bibliothek importieren und das Hauptprogramm nicht ausführen. Wenn Ihr Programm foo.py heißt und Sie "foo" aus einer anderen Python-Datei importieren, wird __name__ zu ausgewertet, aber wenn Sie "python foo.py" über die Befehlszeile ausführen, wird __name__ zu '__main__' ausgewertet.

Beachten Sie, dass brauchen Sie ein Leerzeichen einfügen zwischen wenn und _ und einrücken das Hauptprogramm:

if __name__ == '__main__': 
    main program here 
+0

+1: Wiederverwendung ist wichtig. Ein Modul kann 2 Leben haben. Als Hauptprogramm. Als Komponente in einem anderen Hauptprogramm. Als Hauptprogramm gilt DOES sachen. Als Komponente definiert es lediglich Dinge. –

+0

Dies kann selbstverständlich sein, aber stellen Sie sicher, dass diese Bedingung am Ende Ihrer Datei geht. –

3

Das ist eine gute Praxis. Erstens, es markiert deutlich den Eintrittspunkt Ihres Moduls (vorausgesetzt, Sie haben keinen anderen ausführbaren Code im Toplevel - yuck). Zweitens macht es Ihr Modul von anderen Modulen ohne Ausführung ausführbar, was einige Werkzeuge wie Code-Checker, Packer usw. tun müssen.

22

Ein besseres Muster ist dies:

def main(): 
    ... 

if __name__ == '__main__': 
    main() 

Dieser Code ermöglicht es von jemandem angerufen werden, die es importiert, aber auch Programme wie pychecker und pylint Arbeit zu machen.

+0

danke! Ich war besorgt, dass das ganze Programm von Anfang an eingerückt werden musste. Das hat mir nicht gefallen. –

18

Guido Van Rossum suggests:

def main(argv=None): 
    if argv is None: 
    argv = sys.argv 
    ... 

if __name__ == "__main__": 
    sys.exit(main()) 

Auf diese Weise können main() von woanders (Versorgung der Argumente) ausführen können, und wenn Sie wollen, mit einem Fehlercode verlassen nur return 1 von main(), und es gewann‘ t einen interaktiven Interpreter versehentlich verlassen.

+0

Vielleicht sicherstellen, dass das Beispiel einen Rückgabewert hat, wie im Text beschrieben? –

+0

Alle Funktionen haben einen impliziten Rückgabewert von None, was zu einem Exit-Code 0 führt. –