Qu'est-ce que main.py?
À quoi sert le fichier __main__.py
, quel type de code dois-je y mettre, et quand devrais-je en avoir un?
5 réponses
Souvent, un programme Python est exécuté en nommant un fichier .py sur la ligne de commande:
$ python my_program.py
Vous pouvez également créer un répertoire ou un fichier zip plein de code, et inclure un __main__.py
. Ensuite, vous pouvez simplement nommer le répertoire ou zipfile sur la ligne de commande, et il exécute le __main__.py
automatiquement:
$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program
Vous devrez décider vous-même si votre application pourrait bénéficier d'être exécutée comme ceci.
À quoi sert le fichier
__main__.py
?
Lors de la création d'un module Python, il est courant de faire en sorte que le module exécute certaines fonctionnalités (généralement contenues dans une fonction main
) lorsqu'il est exécuté en tant que point d'entrée du programme. Ceci est généralement fait avec l'idiome commun suivant placé au bas de la plupart des fichiers Python:
if __name__ == '__main__':
# execute only if run as the entry point into the program
main()
, Vous pouvez obtenir la même sémantique pour un paquet Python avec __main__.py
. Ceci est une invite shell linux, $
, Si vous n'avez pas Bash (ou un autre Posix shell) sur Windows, créez simplement ces fichiers à demo/__<init/main>__.py with contents in between the
EOF:
$ mkdir demo
$ cat > demo/__init__.py << EOF
print('demo/__init__.py executed')
def main():
print('main executed')
EOF
$ cat > demo/__main__.py << EOF
print('demo/__main__.py executed')
from __init__ import main
main()
EOF
(dans un shell Posix/Bash, vous pouvez faire ce qui précède sans les << EOF
s et terminer EOF
s en entrant Ctrl-D, le caractère de fin de fichier, à la fin de chaque commande cat)
Et maintenant:
$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed
Vous pouvez dériver ceci de la documention. La documentation dit:
__main__
- environnement de script de niveau supérieur
'__main__'
est le nom de la portée dans laquelle le code de niveau supérieur exécuter. {[14] } d'un module est défini sur {[13] } lorsqu'il est lu à partir de la norme entrée, un script ou à partir d'une invite interactive.Un module peut découvrir s'il s'exécute ou non dans la portée principale en vérifiant son propre
__name__
, qui permet un idiome commun pour exécuter conditionnellement du code dans un module lorsqu'il est exécuté en tant que script ou avec {[17] } mais pas quand il est importé:if __name__ == '__main__': # execute only if run as a script main()
Pour un paquet, le même effet peut être obtenu en incluant un
__main__.py
module, le dont le contenu sera exécuté lorsque le module est exécuté avec-m
.
Zippé
Vous pouvez également empaqueter ceci dans un seul fichier et l'exécuter à partir de la ligne de commande comme ceci - mais notez que les paquets compressés ne peuvent pas exécuter de sous-paquets ou de sous-modules en tant que point d'entrée:
$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed
__main__.py
est utilisé pour les programmes Python dans les fichiers zip. Le fichier __main__.py
sera exécuté lorsque le fichier zip sera exécuté. Par exemple, si le fichier zip était en tant que tel:
test.zip
__main__.py
Et le contenu de __main__.py
est
import sys
print "hello %s" % sys.argv[1]
Ensuite, si nous devions courir python test.zip world
nous sortirions hello world
.
Donc le fichier __main__.py
s'exécute lorsque python est appelé sur un fichier zip.
Vous créez __main__.py
dans yourpackage
pour le rendre exécutable comme:
$ python -m yourpackage
Si votre script est un répertoire ou un fichier ZIP plutôt que d'un seul fichier python, __main__.py
sera exécuté lorsque le "script" est passé comme argument à l'interpréteur python.