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__.pymodule, 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.