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.
et en php: http://www.desfrenes.com/blog/post/python-wannabe/
Dommage que tu ai arrêté ce blog, je l’aimais bien.
Pour le moment c’est moi l’idiome.
Je vais tâcher de ne pas le rester :D
mouarf, dirais-je
super pratique pour créer des libs et les testers ! on peut se faire des petits scripts de test grace à ce main !
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.
Merci :)
Excellent blog, tres clair et bien explique, et amusant. Un grand merci. RC
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..
As usual, simple, clair et fun
Merci beaucoup !
Vos tutos sont géniaux !
:)
…enfin une explication simple à un truc quelque peu obscur ! ;-))
Merci
A noter que ça ne marche pas avec bpython en python 2.7, y’a un bug.
$ bpython