À quoi sert le __main__.py
fichier, quel type de code dois-je y mettre et quand dois-je en avoir un?
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.
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).python3 program_dir
et ça a fonctionné__init__.py
.python3 dir
s'exécute__main__.py
mais pas__init__.py
, tandis quepython3 -m dir
s'exécute les deux.__main__.py
lequel a déclenché l'importation de__init__.py
À quoi sert le
__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: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 fichiersdemo/__<init/main>__.py
avec un contenu entre lesEOF
s:(Dans un shell Posix / Bash, vous pouvez faire ce qui précède sans le
<< EOF
s et la fin deEOF
s en entrant Ctrl+ D, le caractère de fin de fichier, à la fin de chaque commande cat)Et maintenant:
Vous pouvez dériver cela de la documentation. La documentation dit:
Zippé
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:
la source
__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:et le contenu de
__main__.py
étaitEnsuite, si nous
python test.zip world
devions courir, nous sortirionshello world
.Le
__main__.py
fichier s'exécute donc lorsque python est appelé sur un fichier zip.la source
Vous créez
__main__.py
dansyourpackage
pour le rendre exécutable comme:la source
-m
fonctionne si seul le programme est accessible en tant que module, sinon vous pouvez utiliserpython <yourpackage>
REMARQUE: sans-m
optionpackage
?python -m <yourproject>
fonctionne pas,-m
est une option redondante, maispython <yourpackage>
fonctionne bien.a
et assumer le scripta/b/c/__main__.py
...python -m b.c
s'exécutera à partir du répertoirea
et les importations du script principal seront relatives àa
. Maispython b/c
s'exécutera à partir de la portée d'importation de dirc
et donc toute importation comme dans le script principal commeimport b.d
échouera.Si votre script est un répertoire ou un fichier ZIP plutôt qu'un fichier python unique,
__main__.py
il sera exécuté lorsque le "script" sera passé en argument à l'interpréteur python.la source