2008-11-13 5 views
14

Dois-je lancer un programme Python avec:programme Python commencer

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

Et si oui, pourquoi? Je l'ai vu de nombreuses fois mais je n'en ai aucune idée.

+0

@Kirill Titov: Veuillez ne pas modifier la question pour dire "Fermé". Ce n'est pas fermé. Vous avez choisi une réponse - c'est parfait, et tout ce que vous avez besoin de faire. Faire plus est source de confusion. –

Répondre

23

Si votre programme est utilisable en tant que bibliothèque mais que vous disposez également d'un programme principal (par exemple pour tester la bibliothèque), cette structure permet aux autres d'importer le fichier en tant que bibliothèque et non en exécutant votre programme principal. Si votre programme s'appelle foo.py et que vous importez "foo" à partir d'un autre fichier python, __name__ évalue à 'foo', mais si vous exécutez "python foo.py" à partir de la ligne de commande, __name__ évalue à '__main__'.

Notez que vous avez besoin d'insérer un espace entre si et _, et en retrait du programme principal:

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

+1: La réutilisation est importante. Un module peut avoir 2 vies. En tant que programme principal. En tant que composant dans un autre programme principal. Comme le programme principal est des choses. En tant que composant, il définit simplement les choses. –

+0

Cela peut aller sans dire, mais assurez-vous que ce conditionnel va à la fin de votre fichier. –

3

Cette pratique est bonne. Tout d'abord, il marque clairement le point d'entrée de votre module (en supposant que vous n'avez aucun autre code exécutable à toplevel-yuck). Deuxièmement, il rend votre module importable par d'autres modules sans exécution, ce que certains outils comme les vérificateurs de code, les emballeurs, etc. doivent faire.

22

Un modèle mieux est ceci:

def main(): 
    ... 

if __name__ == '__main__': 
    main() 

Cela permet à votre code être invoquée par quelqu'un qui l'a importé, tout en faisant des programmes tels que pychecker et pylint travail.

+0

merci! J'étais inquiet que tout le programme devait être indenté dès le départ. Je n'ai pas aimé ça. –

18

Guido Van Rossum suggests:

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

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

De cette façon, vous pouvez exécuter main() d'ailleurs (fournir les arguments), et si vous voulez sortir avec un code d'erreur juste return 1 de main(), et il a gagné » t faire sortir un interpréteur interactif par erreur.

+0

Assurez-vous que l'exemple a une valeur de retour comme indiqué dans le texte? –

+0

Toutes les fonctions ont une valeur de retour implicite de None, ce qui se traduit par un code de sortie de 0. –

Questions connexes