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?

217
demandé sur slang 2010-10-28 16:28:20

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.

229
répondu Ned Batchelder 2015-03-26 13:00:37

À 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
54
répondu Aaron Hall 2018-09-19 06:39:31

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

21
répondu Blue Peppers 2010-10-28 12:34:11

Vous créez __main__.py dans yourpackage pour le rendre exécutable comme:

$ python -m yourpackage
13
répondu anatoly techtonik 2016-10-05 03:07:29

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.

12
répondu Wooble 2010-10-28 12:34:17