Pourquoi __init__.py est nécessaire, probablement tout pythoniste le sait, mais qu'en est-il de __main__.py ? J'ai vu de nombreux projets, en fonctionnement ou sur Github, qui n'utilisent pas ce fichier magique, bien qu'ils puissent leur faciliter la vie. À mon avis, __main__.py est le meilleur moyen d'interagir avec des modules Python composés de plusieurs fichiers.
Mais faisons les choses en premier: comment la plupart des gens exécutent-ils leurs scripts Python?
Une fois que vous avez écrit un programme que vous souhaitez utiliser à la fois comme module importé et comme outil lancé à partir de la ligne de commande. Vous savez très probablement ce qui se fait habituellement dans ce cas:
if __name__ == '__main__': main(sys.argv)
Lorsque vous alimentez le script à l'interpréteur, la variable globale magique __name__ obtient la valeur __main__ . Ainsi, nous apprenons que ce n'est pas une importation, mais un lancement. Par exemple:
python myapp.py
Et cela fonctionne très bien pour un seul fichier.
Le problème
Mais si vous êtes comme moi, vous ne voudrez pas que votre application entière soit entassée dans un seul fichier. La division de la logique en différents fichiers simplifie l'édition et la prise en charge. Par exemple:
. ├── README.me ├── requirements.txt ├── setup.py └── src ├── __init__.py ├── client.py ├── logic.py ├── models.py └── run.py
Mais l'utilisateur qui a cloné le projet à partir du référentiel ne comprendra pas - lequel de ces fichiers est le principal? Run.py est- il vraiment? Ou peut-être client.py ? Où chercher la chaîne familière si __name__ == '__main__' ? C'est là que __main__.py est en mesure de faire ses preuves.
__main__.py
Le fichier __main__.py est appelé lorsque le projet démarre avec l'indicateur de module - -m . Et cela est très pratique si le code est destiné à être utilisé comme module et à être lancé à partir de la console. Considérez ce fichier comme un endroit où mettre tout ce que vous mettez habituellement à l'intérieur si __name__ == ' __main__' . Modifions le projet de l'exemple ci-dessus en conséquence:
. ├── README.me ├── requirements.txt ├── setup.py └── myapp ├── __init__.py ├── __main__.py ├── client.py ├── logic.py ├── models.py
Et le tour est joué! Vous pouvez maintenant simplement démarrer le projet en tant que module standard.
python -m myapp
__main__.py sera exécuté automatiquement. C'est l'endroit idéal pour héberger l'interface de ligne de commande et gérer les arguments d'entrée!