2010-01-24 9 views
10

Dies ist die größte Newbie Frage auf dem Planeten, aber ich bin mir einfach nicht sicher. Ich habe eine Reihe von Funktionen geschrieben, die einige Aufgaben ausführen, und ich möchte eine "Haupt" -Funktion, die zum Beispiel, wenn ich "someProgram.py" aufrufen, function1, function2 und quit ausführen. Ich erinnere mich vage an etwas über "Haupt", aber ich habe keine Ahnung.Nachdem ich ein Python-Programm in Funktionen zerlegt habe, wie mache ich eine der Hauptfunktionen?

+2

+1 Es ist eine tolle Neuling Frage! –

Antwort

12

Python-Skripte ist nicht Sammlung von Funktionen, sondern Sammlungen von Aussagen - Funktion und Klassendefinitionen sind nur Aussagen, die Namen binden funktionieren oder Klasse Objekte.

Wenn Sie eine Druckanweisung oben oder in der Mitte Ihres Programms ablegen, wird sie normal ausgeführt, ohne dass sie in irgendeiner Funktion ist. Das bedeutet, dass Sie einfach den Hauptcode am Ende der Datei ablegen können und dieser wird ausgeführt, wenn das Skript ausgeführt wird. Wenn Ihr Skript jedoch importiert wird und nicht direkt ausgeführt wird, wird dieser Code ebenfalls ausgeführt. Dies ist normalerweise nicht das, was Sie wollen, also würden Sie das vermeiden wollen.

Python stellt die globale Variable __name__ zur Verfügung, um zu unterscheiden, wenn ein Skript importiert und direkt ausgeführt wird - es wird auf den Namen festgelegt, unter dem das Skript ausgeführt wird. Wenn das Skript importiert wird, ist dies der Name der Skriptdatei. Wenn es direkt ausgeführt wird, wird es "__main__" sein. Sie können also if __name__ == '__main__': an den unteren Rand Ihres Programms setzen, und alles innerhalb dieses if-Blocks wird nur ausgeführt, wenn das Skript direkt ausgeführt wird.

Beispiel.

+1

Fühlte den Drang, zu dieser ausgezeichneten Antwort hinzuzufügen. –

+0

+1. '__name__' ist eigentlich der Name des" aktuellen "Moduls, das (nicht zufällig, ich bin mir sicher) bequem für' __main__' funktioniert (was speziell ist, aber immer noch ein Modul). Dies ist praktisch kombiniert mit Protokollierung oder http://stackoverflow.com/questions/2000861/retrieve-module-object-from-stack-frame/2011168#2011168 –

1

Es ist das folgende Idiom:

if __name__ == "__main__": 
    yourfoo() 

Also read this.

2
if __name__ == '__main__': 
    run_main() 
+0

Dies beantwortet nicht wirklich die Frage wie geschrieben, es beantwortet "Wie bekomme ich meine Hauptfunktion, nicht zu laufen, wenn mein Modul importiert wird?". Wenn Sie bereits eine 'run_main'-Funktion haben, müssen Sie sie nur aufrufen. Die Antwort von Max S ist mir vorzuziehen. –

3

Wenn ein Python-Modul zum ersten Mal importiert wird, wird der Hauptblock ausgeführt. Sie können sich zwischen Sein laufen unterscheiden und in ein anderes Programm importiert werden:

if __name__ == "__main__": 
    function1() 
    function2() 
else: 
    # loaded from another module 
1

Während ich Ihre Frage lese, fragen Sie, wie man eine Hauptfunktion definiert. Das wäre eigentlich mit so etwas wie geschehen:

def main(): 
    function1() 
    function2() 
    return 0 

Und dann würden Sie Code so etwas wie dies außerhalb all Ihre Hauptdatei Funktionen setzen:

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

(Natürlich müssen Sie ein import sys irgendwo für die oben zur Arbeit.)

A (jetzt irgendwie alt, aber immer noch relevant) post from Guido erzählt mehr.

+1

'return 0'? Das ist Python, nicht C :). –

+0

Was ist das Problem? Es verursacht keinen Fehler und teilt dem Betriebssystem mit, dass Sie ohne Fehler beendet haben, daher wird es in mindestens einigen Kreisen als gute Übung angesehen. – GreenMatt

+0

Entschuldigung, du hast Recht. Ich habe es nicht im Zusammenhang mit dem 'sys.exit' gelesen. –

Verwandte Themen