À quoi sert le __main__.py
fichier, quel type de code dois-je y mettre et quand dois-je en avoir un?
À quoi sert le __main__.py
fichier, quel type de code dois-je y mettre et quand dois-je en avoir un?
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 fichier __main__.py
. Ensuite, vous pouvez simplement nommer le répertoire ou le fichier zip sur la ligne de commande, et il exécute __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 par vous-même si votre application pourrait bénéficier d'une telle exécution.
Notez qu'un __main__
module ne provient généralement pas d'un __main__.py
fichier. C'est possible, mais ce n'est généralement pas le cas. Lorsque vous exécutez un script comme python my_program.py
, le script s'exécutera en tant que __main__
module au lieu du my_program
module. Cela se produit également pour les modules exécutés en tant que python -m my_module
ou de plusieurs autres manières.
Si vous avez vu le nom __main__
dans un message d'erreur, cela ne signifie pas nécessairement que vous devriez rechercher un __main__.py
fichier.
python3 program_dir
et ça a fonctionné __init__.py
.
python3 dir
s'exécute __main__.py
mais pas __init__.py
, tandis que python3 -m dir
s'exécute les deux.
__main__.py
lequel a déclenché l'importation de__init__.py
__main__.py
fichier?Lors de la création d'un module Python, il est courant que le module exécute certaines fonctionnalités (généralement contenues dans une main
fonction) lorsqu'il est exécuté comme point d'entrée du programme. Cela se fait généralement 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 package Python avec __main__.py
. Il s'agit d'une invite de shell Linux $
, si vous n'avez pas Bash (ou un autre shell Posix) sous Windows, créez simplement ces fichiers demo/__<init/main>__.py
avec un contenu entre les EOF
s:
$ 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 le << EOF
s et la fin de 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 cela de la documentation. 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 s'exécute. Un module__name__
est défini égal à'__main__'
lorsqu'il est lu à partir d'une entrée standard, d'un script ou d'une invite interactive.Un module peut découvrir s'il s'exécute ou non dans la portée principale en vérifiant le sien
__name__
, ce qui permet à un idiome commun d'exécuter conditionnellement du code dans un module lorsqu'il est exécuté en tant que script ou avecpython -m
mais pas lorsqu'il est importé:if __name__ == '__main__': # execute only if run as a script main()
Pour un package, le même effet peut être obtenu en incluant un
__main__.py
module, dont le contenu sera exécuté lors de l'exécution du module-m
.
Vous pouvez également empaqueter cela dans un seul fichier et l'exécuter à partir de la ligne de commande comme ceci - mais notez que les paquets zippés ne peuvent pas exécuter des sous-paquets ou des sous-modules comme 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 __main__.py
fichier sera exécuté lors de l'exécution du fichier zip. Par exemple, si le fichier zip était en tant que tel:
test.zip
__main__.py
et le contenu de __main__.py
était
import sys
print "hello %s" % sys.argv[1]
Ensuite, si nous python test.zip world
devions courir, nous sortirions hello world
.
Le __main__.py
fichier s'exécute donc lorsque python est appelé sur un fichier zip.
Vous créez __main__.py
dans yourpackage
pour le rendre exécutable comme:
$ python -m yourpackage
-m
fonctionne si seul le programme est accessible en tant que module, sinon vous pouvez utiliser python <yourpackage>
REMARQUE: sans -m
option
package
?
python -m <yourproject>
fonctionne pas, -m
est une option redondante, mais python <yourpackage>
fonctionne bien.
a
et assumer le script a/b/c/__main__.py
... python -m b.c
s'exécutera à partir du répertoire a
et les importations du script principal seront relatives à a
. Mais python b/c
s'exécutera à partir de la portée d'importation de dir c
et donc toute importation comme dans le script principal comme import b.d
échouera.
python -m program_dir
etpython program_dir
un peu différent: ce dernier ne tourne jamais__init__.py
dans le répertoire (s'il y en a un).