
Questo articolo descrive cosa significa se __name__ == ‘__main__’ è spesso scritto nel codice Python.
I trattini bassi possono confonderti, ma è solo un’istruzione if che dice “esegui il codice seguente se il valore memorizzato in __name__ è la stringa ‘__main__'”, quindi è facile capire se conosci il significato di __name__ e ‘__main__’ .
In questo articolo vengono descritti i seguenti contenuti.
- Cos’è __nome__?
- Che cos’è ‘__main__’?
- Cosa significa se __name__ == ‘__main__’ significa?
- Vieni a usare se __name__ == ‘__main__’
- Scrivere il codice di prova per il modulo
- Usa il modulo come comando
- La funzione main() in Python
In Python, le stringhe letterali possono essere rappresentate sia da virgolette singole ‘che da virgolette doppie “, quindi se __name__ == “__main__” ha lo stesso significato.
Cos’è __nome__?
Quando importi un modulo memorizzato, il suo attributo __name__ il nome del modulo come una stringa str. Puoi ottenerlo con . __nome__.
import math
import numpy as np
print(math.__name__)
# math
print(np.__name__)
# numpy
Lo stesso vale per i moduli che definisci.
Ad esempio, crea un modulo hello (hello.py) come segue. Nel modulo è definita una funzione per l’output di __name__.
def func():
print('Hello!')
print('__name__ is', __name__)
Se importi e usi questo modulo ciao, sembra così.
import hello
print(hello.__name__)
# hello
hello.func()
# Hello!
# __name__ is hello
Puoi vedere che il nome del modulo ‘hello’ è memorizzato nel __name__ del modulo importato.
Che cos’è ‘__main__’?
Come accennato in precedenza, il nome del modulo viene memorizzato in __name__ quando viene importato da un altro file.
D’altra parte, se esegui il file come script dalla riga di comando, __name__ memorizza la stringa ‘__main__’.
Ad esempio, crea test_module (test_module.py) e test_main.py per importarlo e utilizzarlo.
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()
Se esegui test_main.py dalla riga di comando con il comando python (o python3, ottieni il seguente risultato.
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
Come nell’esempio sopra, il nome del modulo ‘test_module’ è memorizzato nel __name__ del modulo importato test_module.
D’altra parte, se esegui test_module.py stesso dalla riga di comando, ottieni il seguente risultato.
python3 test_module.py
# Start if __name__ == '__main__'
# call func()
# This is func() in test_module.py
# __name__ is __main__
La stringa ‘__main__’ è memorizzata in __name__ e il processo dopo se __name__ == ‘__main__’: viene eseguito.
Pertanto, ” viene archiviato in __name__ quando viene importato da un altro file e la stringa ‘__main__’ viene archiviato in __name__ quando viene eseguita dalla riga di comando con il comando python (o python3).
Nota che la stringa ‘__main__’ è memorizzata in __name__ anche quando il comando python viene eseguito come modulo con l’opzione -mo in modalità interattiva.
python3 -m test_module
# Start if __name__ == '__main__'
# call func()
# This is func() in test_module.py
# __name__ is __main__
Cosa significa se __name__ == ‘__main__’ significa?
Per riassumere, il valore memorizzato in __name__ è il seguente.
- Quando il file (modulo) viene importato da un altro file:
- __il nome è ”.
- Quando viene eseguito il file stesso viene come script con il comando python (o python3):
Pertanto, se __name__ == ‘__main__’ significa “esegui il codice seguente solo se questo file viene eseguito come script dalla riga di comando”. Se il file viene importato da un altro file, il codice non verrà eseguito.
Vieni a usare se __name__ == ‘__main__’
È possibile utilizzare if __name__ == ‘__main__’ per scrivere il codice di test per un modulo o è disponibile come comando.
Scrivere il codice di prova per il modulo
Se si desidera verificare il risultato di output di una funzione di un modulo, scrivere un codice di test dopo if __name__ == ‘__main__’.
Ad esempio, nel caso di ciao.py sopra:
def func():
print('Hello!')
print('__name__ is', __name__)
Non accadrà nulla se esegui questo file dalla riga di comando poiché definisce solo una funzione.
Aggiungi se __name__ == ‘__main__’.
def func():
print('Hello!')
print('__name__ is', __name__)
if __name__ == '__main__':
func()
Quando questo file viene eseguito dalla riga di comando, la funzione nel modulo viene eseguita in base al codice dopo if __name__ == ‘__main__’.
python3 hello_if_name.py
# Hello!
# __name__ is __main__
Se il file viene importato da un altro file, il codice dopo if __name__ == ‘__main__’ non verrà eseguito, quindi non verrà eseguito alcun processo aggiuntivo.
Usa il modulo come comando
Se vuoi usare il modulo come comando, puoi anche usare if __name__ == ‘__main__’.
Crea un modulo come segue.
import sys
def add(a, b):
return a + b
if __name__ == '__main__':
print(add(float(sys.argv[1]), float(sys.argv[2])))
Dopo if __name__ == ‘__main__’, gli argomenti della riga di comando vengono recuperati con sys.argv e passati alle funzioni nel modulo.
sys.argv è un elenco di argomenti della riga di comando e il primo elemento sys.argv[0] è il nome dello script. Perché sono memorizzato come str, se vuoi trattarli come un numero, convertili con int() e float().
Quando viene eseguito dalla riga di comando con argomenti, le funzioni nel modulo possono essere eseguite.
python3 add_module.py 1.2 3.4
# 4.6
Naturalmente, è possibile importare e utilizzare da altri file. In questo caso, il codice dopo if __name__ == ‘__main__’ non verrà eseguito.
import add_module
print(add_module.add(100, 200))
# 300
Nota che se vuoi usare il modulo come comando, puoi preparare un altro file per quello scopo.
import sys
import add_module
print(add_module.add(float(sys.argv[1]), float(sys.argv[2])))
Il risultato è il seguente.
python3 add_module_command.py 1.2 3.4
# 4.6
In questo caso, se __name__ == ‘__main__’ non è necessario.
Se usi il modulo argparse per poterlo usare come comando, potrebbe essere più semplice creare un file separato.
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))
Il risultato è il seguente.
python3 add_module_argparse.py 1.2 3.4
# 4.6
La funzione main() in Python
In Python, non processo automaticamente con la funzione main(), come nel linguaggio C. Anche se non si avvia una funzione con quella inizia automaticamente,
I due codici seguenti hanno entrambi lo stesso risultato.
Scrivi la funzione principale().
def main():
print('Hello!')
if __name__ == '__main__':
main()
Non utilizzare la funzione principale().
Il risultato quando eseguito dalla riga di comando è lo stesso.
python3 hello_main.py
# Hello!
python3 hello_direct.py
# Hello!
Come convenzione, speciale per programmi di grandi dimensioni, ma è solo per chiarezza e non ha alcun significato speciale nelle specifiche Python, né è richiesto.