Étant donné le code suivant, que fait le if __name__ == "__main__":
?
# Threading example
import time, thread
def myfunction(string, sleeptime, lock, *args):
while True:
lock.acquire()
time.sleep(sleeptime)
lock.release()
time.sleep(sleeptime)
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
python
namespaces
main
python-module
idioms
Dévoué
la source
la source
if __name__ == "__main__":
condition de bloc a- t-elle été déconseillée / obsolète jusqu'à Python 3? J'ai trouvé des informations le confirmant.Réponses:
Chaque fois que l'interpréteur Python lit un fichier source, il fait deux choses:
il définit quelques variables spéciales comme
__name__
, puisil exécute tout le code trouvé dans le fichier.
Voyons comment cela fonctionne et comment cela se rapporte à votre question sur les
__name__
vérifications que nous voyons toujours dans les scripts Python.Exemple de code
Utilisons un exemple de code légèrement différent pour explorer le fonctionnement des importations et des scripts. Supposons que ce qui suit se trouve dans un fichier appelé
foo.py
.Variables spéciales
Lorsque l'interpeter Python lit un fichier source, il définit d'abord quelques variables spéciales. Dans ce cas, nous nous soucions de la
__name__
variable.Lorsque votre module est le programme principal
Si vous exécutez votre module (le fichier source) comme programme principal, par exemple
l'interprète affectera la chaîne codée en dur
"__main__"
à la__name__
variable, c'est-à-direLorsque votre module est importé par un autre
D'un autre côté, supposons qu'un autre module soit le programme principal et qu'il importe votre module. Cela signifie qu'il y a une déclaration comme celle-ci dans le programme principal, ou dans un autre module, le programme principal importe:
L'interpréteur recherchera votre
foo.py
fichier (ainsi que la recherche de quelques autres variantes), et avant d'exécuter ce module, il attribuera le nom"foo"
de l'instruction d'importation à la__name__
variable, c'est-à-direExécution du code du module
Une fois les variables spéciales configurées, l'interpréteur exécute tout le code du module, une instruction à la fois. Vous souhaiterez peut-être ouvrir une autre fenêtre sur le côté avec l'exemple de code afin de pouvoir suivre cette explication.
Toujours
Il imprime la chaîne
"before import"
(sans guillemets).Il charge le
math
module et l'affecte à une variable appeléemath
. Cela équivaut à le remplacerimport math
par ce qui suit (notez qu'il__import__
s'agit d'une fonction de bas niveau en Python qui prend une chaîne et déclenche l'importation réelle):Il imprime la chaîne
"before functionA"
.Il exécute le
def
bloc, crée un objet fonction, puis affecte cet objet fonction à une variable appeléefunctionA
.Il imprime la chaîne
"before functionB"
.Il exécute le deuxième
def
bloc, crée un autre objet fonction, puis l'affecte à une variable appeléefunctionB
.Il imprime la chaîne
"before __name__ guard"
.Uniquement lorsque votre module est le programme principal
__name__
a bien été défini sur"__main__"
et il appelle les deux fonctions, en imprimant les chaînes"Function A"
et"Function B 10.0"
.Uniquement lorsque votre module est importé par un autre
__name__
sera"foo"
, non"__main__"
, et ça va sauter le corps de laif
déclaration.Toujours
"after __name__ guard"
dans les deux situations.Sommaire
En résumé, voici ce qui serait imprimé dans les deux cas:
Pourquoi ça marche comme ça?
Vous pourriez naturellement vous demander pourquoi quelqu'un voudrait cela. Eh bien, parfois, vous voulez écrire un
.py
fichier qui peut être à la fois utilisé par d'autres programmes et / ou modules en tant que module, et peut également être exécuté en tant que programme principal lui-même. Exemples:Votre module est une bibliothèque, mais vous voulez avoir un mode script où il exécute des tests unitaires ou une démo.
Votre module n'est utilisé que comme programme principal, mais il a quelques tests unitaires, et le framework de test fonctionne en important des
.py
fichiers comme votre script et en exécutant des fonctions de test spéciales. Vous ne voulez pas qu'il essaie d'exécuter le script simplement parce qu'il importe le module.Votre module est principalement utilisé comme programme principal, mais il fournit également une API conviviale pour les utilisateurs avancés.
Au-delà de ces exemples, il est élégant que l'exécution d'un script en Python consiste simplement à configurer quelques variables magiques et à importer le script. "Exécuter" le script est un effet secondaire de l'importation du module du script.
Nourriture pour la pensée
Question: Puis-je avoir plusieurs
__name__
blocs de vérification? Réponse: c'est étrange de le faire, mais la langue ne vous arrêtera pas.Supposons que ce qui suit est dedans
foo2.py
. Que se passe-t-il si vous ditespython foo2.py
sur la ligne de commande? Pourquoi?__name__
enregistrementfoo3.py
:la source
subprocess.run('foo_bar.py')
dans un script python? Je suppose quefoo_bar
cela commencera__name__ = '__main__'
comme lorsque j'introduisfoo_bar.py
manuellement cmd. Est-ce le cas? En tenant compte de la réponse de @MrFooz, cela ne devrait poser aucun problème et avoir autant de modules "principaux" à la fois que je le souhaite. Même la modification de la__name__
valeur ou le fait d'avoir plusieurs instances indépendantes (ou des instances qui se sont créées les unes les autressubprocess
) interagissent les unes avec les autres devrait être normal pour Python. Dois-je manquer quelque chose?subprocess.run
. Cela dit, une façon généralement meilleure de partager du code entre des scripts consiste à créer des modules et à faire en sorte que les scripts appellent les modules partagés au lieu de s'appeler mutuellement en tant que scripts. Il est difficile de déboguer lessubprocess.run
appels car la plupart des débogueurs ne dépassent pas les limites des processus, cela peut ajouter des frais généraux non triviaux pour créer et détruire les processus supplémentaires, etc.from foo2 import functionB
importer foo2 depuis functionB? C'est une contorsion sémantique.from module import method
importe la méthode du module.multiprocessing
notamment de rendre ce test nécessaire sous Windows.Lorsque votre script est exécuté en le passant sous forme de commande à l'interpréteur Python,
tout le code qui est au niveau d'indentation 0 est exécuté. Les fonctions et les classes qui sont définies sont, bien, définies, mais aucun de leur code n'est exécuté. Contrairement à d'autres langages, il n'y a pas de
main()
fonction qui s'exécute automatiquement - lamain()
fonction est implicitement tout le code au niveau supérieur.Dans ce cas, le code de niveau supérieur est un
if
bloc.__name__
est une variable intégrée qui évalue le nom du module actuel. Cependant, si un module est exécuté directement (commemyscript.py
ci-dessus), il__name__
est alors défini sur la chaîne"__main__"
. Ainsi, vous pouvez tester si votre script est exécuté directement ou importé par autre chose en testantSi votre script est importé dans un autre module, ses différentes définitions de fonctions et de classes seront importées et son code de niveau supérieur sera exécuté, mais le code dans le corps de la
if
clause ci-dessus ne sera pas exécuté car la condition est pas rencontré. Comme exemple de base, considérez les deux scripts suivants:Maintenant, si vous invoquez l'interpréteur comme
La sortie sera
Si vous exécutez à la
two.py
place:Vous obtenez
Ainsi, lorsque le module
one
est chargé, son__name__
égal"one"
au lieu de"__main__"
.la source
L'explication la plus simple de la
__name__
variable (imho) est la suivante:Créez les fichiers suivants.
et
En les exécutant, vous obtiendrez cette sortie:
Comme vous pouvez le voir, lorsqu'un module est importé, Python définit
globals()['__name__']
dans ce module le nom du module. De plus, lors de l'importation, tout le code du module est en cours d'exécution. Comme l'if
instruction est évaluée,False
cette partie n'est pas exécutée.Comme vous pouvez le voir, lorsqu'un fichier est exécuté, Python définit
globals()['__name__']
ce fichier sur"__main__"
. Cette fois, l'if
instruction est évaluéeTrue
et est en cours d'exécution.la source
Pour décrire les bases:
La variable globale
__name__
, dans le module qui est le point d'entrée de votre programme, est'__main__'
. Sinon, c'est le nom par lequel vous importez le module.Ainsi, le code sous le
if
bloc ne s'exécutera que si le module est le point d'entrée de votre programme.Il permet au code du module d'être importable par d'autres modules, sans exécuter le bloc de code ci-dessous lors de l'importation.
Pourquoi avons nous besoin de ça?
Développer et tester votre code
Supposons que vous écrivez un script Python conçu pour être utilisé comme module:
Vous pouvez tester le module en ajoutant cet appel de la fonction en bas:
et l'exécuter (sur une invite de commande) avec quelque chose comme:
Le problème
Cependant, si vous souhaitez importer le module dans un autre script:
Lors de l'importation, la
do_important
fonction serait appelée, vous feriez donc probablement commenter votre appel de fonctiondo_important()
en bas.Et puis vous devrez vous rappeler si vous avez ou non commenté votre appel de fonction de test. Et cette complexité supplémentaire signifierait que vous êtes susceptible d'oublier, ce qui rend votre processus de développement plus difficile.
Une meilleure façon
La
__name__
variable pointe vers l'espace de noms où se trouve actuellement l'interpréteur Python.À l'intérieur d'un module importé, c'est le nom de ce module.
Mais à l'intérieur du module principal (ou d'une session Python interactive, c'est-à-dire la lecture, l'évaluation, la boucle d'impression ou la REPL de l'interpréteur), vous exécutez tout à partir de son
"__main__"
.Donc, si vous vérifiez avant d'exécuter:
Avec ce qui précède, votre code ne s'exécutera que lorsque vous l'exécuterez comme module principal (ou l'appellerez intentionnellement à partir d'un autre script).
Une façon encore meilleure
Il existe cependant un moyen Pythonique d'améliorer cela.
Et si nous voulons exécuter ce processus métier depuis l'extérieur du module?
Si nous mettons le code que nous voulons exercer pendant que nous développons et testons une fonction comme celle-ci, puis vérifions
'__main__'
immédiatement après:Nous avons maintenant une fonction finale pour la fin de notre module qui s'exécutera si nous exécutons le module comme module principal.
Il permettra au module et à ses fonctions et classes d'être importés dans d'autres scripts sans exécuter la
main
fonction, et permettra également au module (et à ses fonctions et classes) d'être appelé lors de l'exécution à partir d'un'__main__'
module différent , c'est-à-direCet idiome peut également être trouvé dans la documentation Python dans une explication du
__main__
module. Ce texte dit:la source
if __name__ == "__main__"
est la partie qui s'exécute lorsque le script est exécuté à partir (disons) de la ligne de commande en utilisant une commande commepython myscript.py
.la source
helloworld.py
avec justeprint("hello world")
dedans peut-il s'exécuter avec une commandepython helloworld.py
même quand il n'y en a pasif __name__ == "__main__"
?__name__
est une variable globale (en Python, global signifie en fait au niveau du module ) qui existe dans tous les espaces de noms. Il s'agit généralement du nom du module (en tant questr
type).Cependant, comme seul cas spécial, quel que soit le processus Python que vous exécutez, comme dans mycode.py:
l'espace de noms global autrement anonyme est attribué la valeur de
'__main__'
son__name__
.Ainsi, y compris les dernières lignes
entraînera l'
main
exécution de la fonction définie de manière unique de votre script .Un autre avantage de l'utilisation de cette construction: vous pouvez également importer votre code en tant que module dans un autre script, puis exécuter la fonction principale si et quand votre programme décide:
la source
Il y a beaucoup de prises différentes ici sur la mécanique du code en question, le "Comment", mais pour moi rien de tout cela n'avait de sens jusqu'à ce que je comprenne le "Pourquoi". Cela devrait être particulièrement utile pour les nouveaux programmeurs.
Prenez le fichier "ab.py":
Et un deuxième fichier "xy.py":
Lorsque vous exécutez
xy.py
, vousimport ab
. L'instruction import exécute le module immédiatement à l'importation, doncab
les opérations sont exécutées avant le reste dexy
. Une fois terminéab
, il continue avecxy
.L'interpréteur garde une trace des scripts exécutés
__name__
. Lorsque vous exécutez un script - quel que soit le nom que vous lui avez donné - l'interpréteur l'appelle"__main__"
, ce qui en fait le script maître ou 'home' auquel on revient après avoir exécuté un script externe.Tout autre script appelé à partir de ce
"__main__"
script se voit attribuer son nom de fichier comme__name__
(par exemple,__name__ == "ab.py"
). Par conséquent, la ligneif __name__ == "__main__":
est le test de l'interpréteur pour déterminer s'il interprète / analyse le script «home» qui a été initialement exécuté, ou s'il jette temporairement un coup d'œil dans un autre script (externe). Cela donne au programmeur la flexibilité nécessaire pour que le script se comporte différemment s'il est exécuté directement par rapport à un appel externe.Parcourons le code ci-dessus pour comprendre ce qui se passe, en nous concentrant d'abord sur les lignes non indentées et l'ordre dans lequel elles apparaissent dans les scripts. Souvenez-vous que les
def
blocs de fonction - ou - ne font rien par eux-mêmes jusqu'à ce qu'ils soient appelés. Ce que l'interprète pourrait dire s'il marmonnait:"__main__"
dans la__name__
variable.__name__ == "ab.py"
.a()
; Je viens de l'apprendre. Impression d' une fonction dans un fichier ab ."__main__"
!x()
; ok, l'impression ' tâche périphérique: pourrait être utile dans d'autres projets '.if
déclaration. Eh bien, la condition a été remplie (la variable__name__
a été définie sur"__main__"
), je vais donc entrer lamain()
fonction et imprimer « fonction principale: c'est là que se situe l'action ».Les deux dernières lignes signifient: "S'il s'agit du
"__main__"
script ou" home ", exécutez la fonction appeléemain()
". C'est pourquoi vous verrez undef main():
bloc en haut, qui contient le flux principal des fonctionnalités du script.Rappelez-vous ce que j'ai dit plus tôt à propos des déclarations d'importation? Lorsque vous importez un module, il ne se contente pas de le «reconnaître» et d'attendre d'autres instructions - il exécute en fait toutes les opérations exécutables contenues dans le script. Ainsi, mettre la viande de votre script dans la
main()
fonction le met effectivement en quarantaine, le mettant en isolation afin qu'il ne s'exécute pas immédiatement lorsqu'il est importé par un autre script.Encore une fois, il y aura des exceptions, mais la pratique courante est que les
main()
appels externes ne sont généralement pas appelés. Donc, vous vous demandez peut-être encore une chose: si nous n'appelons pasmain()
, pourquoi appelons-nous le script? C'est parce que de nombreuses personnes structurent leurs scripts avec des fonctions autonomes conçues pour être exécutées indépendamment du reste du code du fichier. Ils sont ensuite appelés plus tard ailleurs dans le corps du script. Ce qui m'amène à ceci:Oui c'est vrai. Ces fonctions distinctes peuvent être appelées à partir d'un script en ligne qui n'est pas contenu dans une
main()
fonction. Si vous êtes habitué (comme moi, dans mes premières étapes d'apprentissage de la programmation) à créer des scripts en ligne qui font exactement ce dont vous avez besoin, et vous essaierez de le comprendre à nouveau si vous avez besoin de cette opération à nouveau .. Eh bien, vous n'êtes pas habitué à ce type de structure interne à votre code, car il est plus compliqué à construire et ce n'est pas aussi intuitif à lire.Mais c'est un script qui ne peut probablement pas avoir ses fonctions appelées en externe, car s'il le faisait, il commencerait immédiatement à calculer et à affecter des variables. Et il y a de fortes chances que si vous essayez de réutiliser une fonction, votre nouveau script est suffisamment lié à l'ancien pour qu'il y ait des variables en conflit.
En divisant des fonctions indépendantes, vous gagnez la possibilité de réutiliser votre travail précédent en les appelant dans un autre script. Par exemple, "example.py" peut importer "xy.py" et appeler
x()
, en utilisant la fonction 'x' de "xy.py". (Peut-être que cela met en majuscule le troisième mot d'une chaîne de texte donnée; créer un tableau NumPy à partir d'une liste de nombres et les mettre au carré; ou détendre une surface 3D. Les possibilités sont illimitées.)(En passant , cette question contient une réponse de @kindall qui m'a finalement aidé à comprendre - le pourquoi, pas le comment. Malheureusement, il a été marqué comme un double de celui-ci , ce qui, je pense, est une erreur.)
la source
Lorsqu'il y a certaines instructions dans notre module (
M.py
) que nous voulons exécuter quand il s'exécutera en tant que principal (non importé), nous pouvons placer ces instructions (cas de test, instructions d'impression) sous ceif
bloc.Comme par défaut (lorsque le module fonctionne en tant que principal, non importé), la
__name__
variable est définie sur"__main__"
, et lorsqu'elle sera importée, la__name__
variable obtiendra une valeur différente, probablement le nom du module ('M'
). Cela est utile pour exécuter différentes variantes d'un module ensemble, séparer leurs instructions d'entrée et de sortie spécifiques et également s'il existe des cas de test.En bref , utilisez ce
if __name__ == "main"
bloc ' ' pour empêcher l'exécution de (certain) code lors de l'importation du module.la source
En termes simples,
__name__
une variable définie pour chaque script définit si le script est exécuté en tant que module principal ou s’exécute en tant que module importé.Donc, si nous avons deux scripts;
et
La sortie de l'exécution de script1 est
Et la sortie de l'exécution de script2 est:
Comme vous pouvez le voir,
__name__
nous indique quel code est le module «principal». C'est génial, car vous pouvez simplement écrire du code et ne pas avoir à vous soucier de problèmes structurels comme en C / C ++, où, si un fichier n'implémente pas de fonction `` principale '', il ne peut pas être compilé en tant qu'exécutable et s'il le fait, il ne peut alors pas être utilisé comme bibliothèque.Supposons que vous écriviez un script Python qui fait quelque chose de génial et que vous implémentiez un ensemble de fonctions utiles à d'autres fins. Si je veux les utiliser, je peux simplement importer votre script et les utiliser sans exécuter votre programme (étant donné que votre code ne s'exécute que dans le
if __name__ == "__main__":
contexte). Alors qu'en C / C ++, vous devez diviser ces éléments en un module distinct qui inclut ensuite le fichier. Imaginez la situation ci-dessous;Les flèches sont des liens d'importation. Pour trois modules essayant chacun d'inclure le code des modules précédents, il y a six fichiers (neuf, en comptant les fichiers d'implémentation) et cinq liens. Cela rend difficile l'inclusion d'un autre code dans un projet C à moins qu'il ne soit compilé spécifiquement en tant que bibliothèque. Maintenant imaginez-le pour Python:
Vous écrivez un module, et si quelqu'un veut utiliser votre code, il suffit de l'importer et la
__name__
variable peut aider à séparer la partie exécutable du programme de la partie bibliothèque.la source
Regardons la réponse d'une manière plus abstraite:
Supposons que nous ayons ce code dans
x.py
:Les blocs A et B sont exécutés lorsque nous exécutons
x.py
.Mais juste le bloc A (et non B) est exécuté lorsque nous exécutons un autre module,
y.py
par exemple, dans lequelx.py
est importé et le code est exécuté à partir de là (comme lorsqu'une fonction dansx.py
est appelée à partir dey.py
).la source
Lorsque vous exécutez Python de manière interactive, la
__name__
variable locale se voit attribuer une valeur de__main__
. De même, lorsque vous exécutez un module Python à partir de la ligne de commande, plutôt que de l'importer dans un autre module, son__name__
attribut se voit attribuer une valeur de__main__
, plutôt que le nom réel du module. De cette façon, les modules peuvent examiner leur propre__name__
valeur pour déterminer par eux-mêmes comment ils sont utilisés, que ce soit comme support pour un autre programme ou comme application principale exécutée à partir de la ligne de commande. Ainsi, l'idiome suivant est assez courant dans les modules Python:la source
Considérer:
Il vérifie si l'
__name__
attribut du script Python l'est"__main__"
. En d'autres termes, si le programme lui-même est exécuté, l'attribut le sera__main__
, donc le programme sera exécuté (dans ce cas, lamain()
fonction).Cependant, si votre script Python est utilisé par un module, tout code en dehors de l'
if
instruction sera exécuté, ilif \__name__ == "\__main__"
est donc utilisé juste pour vérifier si le programme est utilisé comme module ou non, et décide donc s'il faut exécuter le code.la source
Avant d'expliquer quoi que ce soit à ce sujet,
if __name__ == '__main__'
il est important de comprendre ce qui__name__
est et ce qu'il fait.__name__
est un DunderAlias - peut être considéré comme une variable globale (accessible à partir des modules) et fonctionne de manière similaire àglobal
.C'est une chaîne (globale comme mentionné ci-dessus) comme indiqué par
type(__name__)
(cédant<class 'str'>
), et est une norme intégrée pour les versions Python 3 et Python 2 .Il peut non seulement être utilisé dans les scripts, mais aussi dans l'interpréteur et les modules / packages.
Interprète:
Scénario:
test_file.py :
Résultant en
__main__
Module ou package:
somefile.py:
test_file.py:
Résultant en
somefile
Notez que lorsqu'il est utilisé dans un package ou un module,
__name__
prend le nom du fichier. Le chemin d'accès du module ou du package n'est pas indiqué, mais possède son propre DunderAlias__file__
, ce qui permet cela.Vous devriez voir que, où
__name__
, où il est, le fichier principal (ou programme) retournera toujours__main__
, et s'il s'agit d'un module / package, ou de tout ce qui s'exécute sur un autre script Python, retournera le nom du fichier où il est originaire de.Être une variable signifie que sa valeur peut être écrasée ("peut" ne signifie pas "devrait"), écraser la valeur de
__name__
entraînera un manque de lisibilité. Alors ne le faites pas, pour quelque raison que ce soit. Si vous avez besoin d'une variable, définissez une nouvelle variable.Il est toujours supposé que la valeur de
__name__
soit__main__
ou le nom du fichier. Une fois de plus, la modification de cette valeur par défaut provoquera plus de confusion que cela fera du bien, causant des problèmes plus loin.exemple:
Il est généralement considéré comme une bonne pratique d'inclure les
if __name__ == '__main__'
scripts dans.Nous savons maintenant que le comportement des
__name__
choses devient plus clair:An
if
est une instruction de contrôle de flux qui contient le bloc de code qui s'exécutera si la valeur donnée est vraie. Nous avons vu que cela__name__
peut prendre soit__main__
le nom de fichier à partir duquel il a été importé.Cela signifie que si
__name__
est égal à,__main__
le fichier doit être le fichier principal et doit être en cours d'exécution (ou c'est l'interpréteur), et non un module ou un package importé dans le script.Si en effet
__name__
prend la valeur de__main__
alors tout ce qui se trouve dans ce bloc de code s'exécutera.Cela nous indique que si le fichier en cours d'exécution est le fichier principal (ou si vous exécutez directement depuis l'interpréteur), cette condition doit s'exécuter. S'il s'agit d'un package, il ne devrait pas l'être et la valeur ne le sera pas
__main__
.__name__
peut également être utilisé dans les modules pour définir le nom d'un moduleIl est également possible de faire d'autres choses moins courantes mais utiles avec
__name__
, certaines que je montrerai ici:Exécution uniquement si le fichier est un module ou un package:
Exécuter une condition si le fichier est le principal et une autre s'il ne l'est pas:
Vous pouvez également l'utiliser pour fournir des fonctions / utilitaires d'aide exécutables sur les packages et les modules sans l'utilisation complexe de bibliothèques.
Il permet également d'exécuter des modules à partir de la ligne de commande en tant que scripts principaux, ce qui peut également être très utile.
la source
Je pense qu'il est préférable de casser la réponse en profondeur et en termes simples:
__name__
: Chaque module en Python a un attribut spécial appelé__name__
. Il s'agit d'une variable intégrée qui renvoie le nom du module.__main__
: Comme d'autres langages de programmation, Python a également un point d'entrée d'exécution, c'est-à-dire principal.'__main__'
est le nom de la portée dans laquelle le code de niveau supérieur s'exécute . Fondamentalement, vous avez deux façons d'utiliser un module Python: l'exécuter directement en tant que script ou l'importer. Lorsqu'un module est exécuté en tant que script, il__name__
est défini sur__main__
.Ainsi, la valeur de l'
__name__
attribut est définie sur__main__
lorsque le module est exécuté en tant que programme principal. Sinon, la valeur de__name__
est définie pour contenir le nom du module.la source
C'est une option spéciale lorsqu'un fichier Python est appelé à partir de la ligne de commande. Ceci est généralement utilisé pour appeler une fonction "main ()" ou exécuter un autre code de démarrage approprié, comme la gestion des arguments de ligne de commande par exemple.
Il pourrait être écrit de plusieurs manières. Un autre est:
Je ne dis pas que vous devriez utiliser ceci dans le code de production, mais cela sert à illustrer qu'il n'y a rien de "magique"
if __name__ == '__main__'
. C'est une bonne convention pour invoquer une fonction principale dans des fichiers Python.la source
and
.and
est utilisé pour vérifier si deux déclarations booléennes sont toutes les deux vraies. Puisque vous n'êtes pas intéressé par le résultat de laand
, uneif
déclaration communique plus clairement vos intentions.Il existe un certain nombre de variables que le système (interpréteur Python) fournit pour les fichiers source (modules). Vous pouvez obtenir leurs valeurs à tout moment, alors concentrons-nous sur la variable / l'attribut __name__ :
Lorsque Python charge un fichier de code source, il exécute tout le code qui s'y trouve. (Notez qu'il n'appelle pas toutes les méthodes et fonctions définies dans le fichier, mais il les définit.)
Avant que l'interpréteur n'exécute le fichier de code source, il définit quelques variables spéciales pour ce fichier; __name__ est l'une de ces variables spéciales que Python définit automatiquement pour chaque fichier de code source.
Si Python charge ce fichier de code source en tant que programme principal (c'est-à-dire le fichier que vous exécutez), il définit la variable spéciale __name__ pour que ce fichier ait une valeur "__main__" .
Si cela est importé d'un autre module, __name__ sera défini sur le nom de ce module.
Donc, dans votre exemple en partie:
signifie que le bloc de code:
ne sera exécuté que lorsque vous exécuterez directement le module; le bloc de code ne s'exécutera pas si un autre module l'appelle / l'importe car la valeur de __name__ ne sera pas égale à " main " dans cette instance particulière.
J'espère que cela vous aidera.
la source
if __name__ == "__main__":
est fondamentalement l'environnement de script de niveau supérieur, et il spécifie l'interpréteur qui («J'ai la priorité la plus élevée à exécuter en premier»).'__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.la source
J'ai tellement lu tout au long des réponses sur cette page. Je dirais que si vous connaissez la chose, vous comprendrez certainement ces réponses, sinon, vous êtes toujours confus.
Pour être bref, vous devez connaître plusieurs points:
import a
l'action exécute en fait tout ce qui peut être exécuté dans "a"En raison du point 1, il se peut que vous ne souhaitiez pas que tout soit exécuté dans "a" lors de son importation
Pour résoudre le problème du point 2, python vous permet de mettre une vérification de condition
__name__
est une variable implicite dans tous les.py
modules; quanda.py
est importé, la valeur__name__
dua.py
module est fixé à son nom de fichier "a
« ; quanda.py
est exécuté directement en utilisant "python a.py
", ce qui signifiea.py
est le point d'entrée, alors la valeur__name__
dea.py
module est définie sur une chaîne__main__
En fonction du mécanisme utilisé par python pour définir la variable
__name__
de chaque module, savez-vous comment atteindre le point 3? La réponse est assez simple, non? Mettez un si la condition:if __name__ == "__main__": ...
; vous pouvez même mettre si__name__ == "a"
selon votre besoin fonctionnelLa chose importante que python est spécial au point 4! Le reste n'est qu'une logique de base.
la source
Considérer:
La sortie pour ce qui précède est
__main__
.L'instruction ci-dessus est vraie et affiche la "méthode directe" . Supposons que s'ils ont importé cette classe dans une autre classe, elle n'imprime pas la "méthode directe" car, lors de l'importation, elle sera définie
__name__ equal to "first model name"
.la source
fibo.py (un module nommé
fibo
)Référence: https://docs.python.org/3.5/tutorial/modules.html
la source
La raison pour
est principalement pour éviter les problèmes de verrouillage d'importation qui résulteraient de l' importation directe de code . Vous souhaitez
main()
exécuter si votre fichier a été directement invoqué (c'est le__name__ == "__main__"
cas), mais si votre code a été importé, l'importateur doit entrer votre code à partir du vrai module principal pour éviter les problèmes de verrouillage d'importation.Un effet secondaire est que vous vous connectez automatiquement à une méthodologie qui prend en charge plusieurs points d'entrée. Vous pouvez exécuter votre programme en utilisant
main()
comme point d'entrée, mais ce n'est pas obligatoire . Bien quesetup.py
prévumain()
, d'autres outils utilisent des points d'entrée alternatifs. Par exemple, pour exécuter votre fichier en tant quegunicorn
processus, vous définissez uneapp()
fonction au lieu d'unmain()
. Tout comme avecsetup.py
,gunicorn
importe votre code afin que vous ne vouliez pas qu'il fasse quoi que ce soit pendant son importation (en raison du problème de verrouillage d'importation).la source
Cette réponse s'adresse aux programmeurs Java qui apprennent Python. Chaque fichier Java contient généralement une classe publique. Vous pouvez utiliser cette classe de deux manières:
Appelez la classe à partir d'autres fichiers. Il vous suffit de l'importer dans le programme appelant.
Exécutez la classe de façon autonome, à des fins de test.
Dans ce dernier cas, la classe doit contenir une méthode publique statique void main (). En Python, cet objectif est atteint par l'étiquette définie globalement
'__main__'
.la source
Le code sous
if __name__ == '__main__':
ne sera exécuté que si le module est appelé en tant que script .À titre d'exemple, considérons le module suivant
my_test_module.py
:1ère possibilité: importer
my_test_module.py
dans un autre moduleMaintenant, si vous invoquez
main.py
:Notez que seule l'
print()
instruction de niveau supérieur dansmy_test_module
est exécutée.2ème possibilité: invoquer
my_test_module.py
comme scriptMaintenant, si vous exécutez en
my_test_module.py
tant que script Python, les deuxprint()
instructions seront exécutées:la source
Chaque module en python a un attribut appelé
__name__
. La valeur de l'__name__
attribut est__main__
lorsque le module est exécuté directement, commepython my_module.py
. Sinon (comme quand vous ditesimport my_module
) la valeur de__name__
est le nom du module.Petit exemple à expliquer en bref.
Nous pouvons l'exécuter directement
Production
Supposons maintenant que nous appelons le script ci-dessus à partir d'un autre script
Lorsque vous exécutez cela
Production
Donc, ci-dessus est explicite que lorsque vous appelez test à partir d'un autre script, if loop
__name__
intest.py
ne s'exécutera pas.la source
Si ce fichier .py est importé par d'autres fichiers .py, le code sous "l'instruction if" ne sera pas exécuté.
Si ce .py est exécuté par
python this_py.py
sous shell, ou double-cliqué dans Windows. le code sous "l'instruction if" sera exécuté.Il est généralement écrit pour les tests.
la source
Si l'interpréteur python exécute un module particulier,
__name__
la variable globale aura une valeur"__main__"
Lorsque vous exécutez ce script imprime, vous pouvez me voir
une
Si vous importez ce fichier, dites A au fichier B et exécutez le fichier B, puis
if __name__ == "__main__"
dans le fichier A devient faux, donc il s'imprime Vous ne pouvez pas me voirb
la source
Toutes les réponses ont à peu près expliqué la fonctionnalité. Mais je vais donner un exemple de son utilisation qui pourrait aider à clarifier davantage le concept.
Supposons que vous ayez deux fichiers Python, a.py et b.py. Maintenant, a.py importe b.py. Nous exécutons le fichier a.py, où le code "import b.py" est exécuté en premier. Avant l'exécution du reste du code a.py, le code du fichier b.py doit s'exécuter complètement.
Dans le code b.py, il y a du code exclusif à ce fichier b.py et nous ne voulons pas qu'un autre fichier (autre que le fichier b.py), qui a importé le fichier b.py, l'exécute.
Voilà donc ce que cette ligne de code vérifie. S'il s'agit du fichier principal (c'est-à-dire b.py) exécutant le code, ce qui n'est pas le cas dans ce cas (a.py est le fichier principal en cours d'exécution), seul le code est exécuté.
la source
Créez un fichier, a.py :
__name__
est toujours égal à__main__
chaque fois que ce fichier est exécuté, ce qui montre qu'il s'agit du fichier principal.Créez un autre fichier, b.py , dans le même répertoire:
Exécuter. Il affichera un , c'est-à-dire le nom du fichier importé .
Donc, pour montrer deux comportements différents du même fichier , c'est une astuce couramment utilisée:
la source
si nom == ' principal ':
Nous voyons si
__name__ == '__main__':
souvent.Il vérifie si un module est importé ou non.
En d'autres termes, le code dans le
if
bloc ne sera exécuté que lorsque le code s'exécute directement. Icidirectly
signifienot imported
.Voyons ce qu'il fait en utilisant un code simple qui affiche le nom du module:
Si nous exécutons le code directement via
python test.py
, le nom du module est__main__
:la source
C'est simplement le point d'entrée pour exécuter le fichier, comme la
main
fonction dans le langage de programmation C.la source
if __name__ == "__main__"
bloc. Techniquement, le haut du script exécuté est le point d'entrée du programme.