
Cet article décrit ce que signifie si __name__ == ‘__main__’, ce qui est souvent écrit en code Python.
Les traits de soulignement peuvent vous dérouter, mais c’est juste une instruction if qui dit « exécutez le code suivant si la valeur stockée dans __name__ est la chaîne ‘__main__' », il est donc facile à comprendre si vous connaissez la signification de __name__ et ‘__main__’ .
Cet article décrit le contenu suivant.
- Quel est le nom__?
- Qu’est-ce que ‘__main__’ ?
- Que signifie si __name__ == ‘__main__’ ?
- Comment utiliser if __name__ == ‘__main__’
- Écrivez le code de test pour le module
- Utiliser le module comme commande
- La fonction main() en Python
En Python, les littéraux de chaîne peuvent être représentés à la fois par des guillemets simples ‘ et des guillemets doubles « , donc si __name__ == « __main__ » a la même signification.
Quel est le nom__?
Lorsque vous importez un module, son attribut __name__ stocke le nom du module sous la forme d’une chaîne str. Vous pouvez l’obtenir avec . __Nom__.
import math
import numpy as np
print(math.__name__)
# math
print(np.__name__)
# numpy
Il en va de même pour les modules que vous définissez.
Par exemple, créez un module hello (hello.py) comme suit. Une fonction de sortie __name__ est définie dans le module.
def func():
print('Hello!')
print('__name__ is', __name__)
Si vous importez et utilisez ce module hello, il ressemble à ceci.
import hello
print(hello.__name__)
# hello
hello.func()
# Hello!
# __name__ is hello
Vous pouvez voir que le nom du module ‘hello’ est stocké dans le __name__ du module importé.
Qu’est-ce que ‘__main__’ ?
Comme mentionné ci-dessus, le nom du module est stocké dans __name__ lorsqu’il est importé d’un autre fichier.
D’autre part, si vous exécutez le fichier en tant que script à partir de la ligne de commande, __name__ stocke la chaîne ‘__main__’.
Par exemple, créez test_module (test_module.py) et test_main.py pour l’importer et l’utiliser.
def func():
print(' This is func() in test_module.py')
print(' __name__ is', __name__)
if __name__ == '__main__':
print("Start if __name__ == '__main__'")
print('call func()')
func()
import test_module
print('This is test_main.py')
print('test_module.__name__ is', test_module.__name__)
print('---')
print('call test_module.func()')
test_module.func()
Si vous exécutez test_main.py à partir de la ligne de commande avec la commande python (ou python3, selon votre environnement), vous obtenez le résultat suivant.
python3 test_main.py
# This is test_main.py
# test_module.__name__ is test_module
# ---
# call test_module.func()
# This is func() in test_module.py
# __name__ is test_module
Comme dans l’exemple ci-dessus, le nom du module ‘test_module’ est stocké dans le __name__ du module test_module importé.
D’autre part, si vous exécutez test_module.py lui-même à partir de la ligne de commande, vous obtenez le résultat suivant.
python3 test_module.py
# Start if __name__ == '__main__'
# call func()
# This is func() in test_module.py
# __name__ is __main__
La chaîne ‘__main__’ est stockée dans __name__, et le processus après if __name__ == ‘__main__’: est exécuté.
Ainsi, » est stocké dans __name__ lorsqu’il est importé d’un autre fichier, et la chaîne ‘__main__’ est stockée dans __name__ lorsqu’il est exécuté à partir de la ligne de commande avec la commande python (ou python3).
Notez que la chaîne ‘__main__’ est stockée dans __name__ même lorsque la commande python est exécutée en tant que module avec l’option -m ou en mode interactif.
python3 -m test_module
# Start if __name__ == '__main__'
# call func()
# This is func() in test_module.py
# __name__ is __main__
Que signifie si __name__ == ‘__main__’ ?
Pour résumer, la valeur stockée dans __name__ est la suivante.
- Lorsque le fichier (module) est importé d’un autre fichier :
- __nom est ».
- Lorsque le fichier lui-même est exécuté en tant que script avec la commande python (ou python3) :
Par conséquent, si __name__ == ‘__main__’ signifie « exécuter le code suivant uniquement si ce fichier est exécuté en tant que script à partir de la ligne de commande ». Si le fichier est importé d’un autre fichier, le code ne sera pas exécuté.
Comment utiliser if __name__ == ‘__main__’
Vous pouvez utiliser if __name__ == ‘__main__’ pour écrire du code de test pour un module ou rendre un module disponible en tant que commande.
Écrivez le code de test pour le module
Si vous voulez vérifier le résultat de sortie d’une fonction d’un module, écrivez un code de test après if __name__ == ‘__main__’.
Par exemple, dans le cas de hello.py ci-dessus :
def func():
print('Hello!')
print('__name__ is', __name__)
Rien ne se passera si vous exécutez ce fichier à partir de la ligne de commande puisqu’il ne définit qu’une fonction.
Ajouter si __name__ == ‘__main__’.
def func():
print('Hello!')
print('__name__ is', __name__)
if __name__ == '__main__':
func()
Lorsque ce fichier est exécuté à partir de la ligne de commande, la fonction dans le module est exécutée selon le code après if __name__ == ‘__main__’.
python3 hello_if_name.py
# Hello!
# __name__ is __main__
Si le fichier est importé d’un autre fichier, le code après if __name__ == ‘__main__’ ne sera pas exécuté, donc aucun processus supplémentaire ne sera effectué.
Utiliser le module comme commande
Si vous souhaitez utiliser le module en tant que commande, vous pouvez également utiliser if __name__ == ‘__main__’.
Créez un module comme suit.
import sys
def add(a, b):
return a + b
if __name__ == '__main__':
print(add(float(sys.argv[1]), float(sys.argv[2])))
Après if __name__ == ‘__main__’, les arguments de la ligne de commande sont récupérés avec sys.argv et transmis aux fonctions du module.
sys.argv est une liste d’arguments de ligne de commande et le premier élément sys.argv[0] est le nom du script. Puisqu’ils sont stockés en tant que str, si vous souhaitez les traiter comme un nombre, convertissez-les avec int() et float().
Lorsqu’elles sont exécutées à partir de la ligne de commande avec des arguments, les fonctions du module peuvent être exécutées.
python3 add_module.py 1.2 3.4
# 4.6
Bien sûr, il est possible d’importer et d’utiliser à partir d’autres fichiers. Dans ce cas, le code après if __name__ == ‘__main__’ ne sera pas exécuté.
import add_module
print(add_module.add(100, 200))
# 300
Notez que si vous souhaitez utiliser le module comme une commande, vous pouvez préparer un autre fichier à cet effet.
import sys
import add_module
print(add_module.add(float(sys.argv[1]), float(sys.argv[2])))
Le résultat est le suivant.
python3 add_module_command.py 1.2 3.4
# 4.6
Dans ce cas, si __name__ == ‘__main__’ n’est pas nécessaire.
Si vous utilisez le module argparse pour pouvoir l’utiliser comme commande, il peut être plus simple de créer un fichier séparé.
import argparse
import add_module
parser = argparse.ArgumentParser()
parser.add_argument('a', type=float)
parser.add_argument('b', type=float)
args = parser.parse_args()
print(add_module.add(args.a, args.b))
Le résultat est le suivant.
python3 add_module_argparse.py 1.2 3.4
# 4.6
La fonction main() en Python
En Python, le processus ne démarre pas avec la fonction main(), comme c’est le cas dans le langage C. Même si vous définissez une fonction nommée main, elle ne démarre pas automatiquement avec cette fonction.
Les deux codes suivants ont le même résultat.
Écrivez la fonction main().
def main():
print('Hello!')
if __name__ == '__main__':
main()
N’utilisez pas la fonction main().
Le résultat lorsqu’il est exécuté à partir de la ligne de commande est le même.
python3 hello_main.py
# Hello!
python3 hello_direct.py
# Hello!
Par convention, en particulier pour les gros programmes, la fonction de démarrage peut être nommée main(), mais c’est juste pour plus de clarté et n’a aucune signification particulière dans la spécification Python, et ce n’est pas non plus obligatoire.
