Pourquoi if __name__ == '__main__' en Python ? 9


if __name__ == '__main__' est un un idiome qu’on voit souvent dans les scripts Python.

A quoi sert-il ?

Contrairement à d’autres langages comme le C, le Java ou le C#, Python n’a pas de fonction ou méthode main(). Quand on lance un script, tout le script est exécute dans tous les cas, et aucune fonction n’est appelée automatiquement.

Normalement c’est plutôt une bonne chose. Explicite is better than implicit, tout ça.

Mais cela pose un problème quand on a un script qui contient du code que l’on souhaite exécuter quand on lance le script directement, mais pas quand on l’importe dans un autre script.

Par exemple, un script egouts.py qui ne fait rien d’intéressant (mais qui le fait vachement bien):

 
def tortues():
    print "kawabunga"
 
tortues()

Si on fait python egouts.py, ça va lancer tortues(). Si on fait dans un autre script import egouts, ça va aussi lancer tortues(). Pas glop.

Pour éviter ça:

 
def tortues():
    print "kawabunga"
 
if __name__ == '__main__':
    tortues()

Ainsi, si on fait python egouts.py, ça va lancer tortues() mais pas si on fait import egouts dans un autre script.

Comment ça marche ?

C’est une condition tout à fait ordinaire, on peut mettre des if n’importe où dans du code Python.

La seule astuce consiste en l’existence de la variable __name__ qui est une variable automatiquement créée par Python, toujours disponible, n’importe où, dans tous les scripts.

Cette variable contient le nom du script courant si on importe le script. Ainsi, dans n’importe quel code, on peut vérifier où on est.

Mais si le script est le script principal, alors __name__ ne contient pas le nom du script, il contient la chaîne __main__ (oui, c’est bizarre avec deux underscores, mais c’est une chaîne normale).

Donc on dit juste: si ce code est exécuté en tant que script principal (appelé directement avec Python et pas importé), alors exécuter cette fonction.

9 thoughts on “Pourquoi if __name__ == '__main__' en Python ?

  • mouarf

    Pour le moment c’est moi l’idiome.
    Je vais tâcher de ne pas le rester :D

  • Léo

    super pratique pour créer des libs et les testers ! on peut se faire des petits scripts de test grace à ce main !

  • Paradox

    Je viens de retomber sur cet article (toujours aussi indispensable !) et je viens de remarquer une petite faute à “import egout”, il manque le “s” final.

  • RC

    Excellent blog, tres clair et bien explique, et amusant. Un grand merci. RC

  • Dravo

    Je m’y mets pour programmer un rpi qui pilote une bécane de labo , ( je programme par force , pas par conviction) 1000 ou plus de lignes de python , par tkinter ; en avançant , on remarque que l’on pouvait faire mieux , y a beaucoup de doc sur le web , mais faut trier , ici au moins on apprend un max et on ne se fait pas ch..

Leave a comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.