Dado el siguiente código, ¿qué hace 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
Devoto
fuente
fuente
if __name__ == "__main__":
condición de bloque ha quedado obsoleta / obsoleta hasta Python 3? He encontrado información que lo indica.Respuestas:
Cada vez que el intérprete de Python lee un archivo fuente, hace dos cosas:
establece algunas variables especiales como
__name__
, y luegoejecuta todo el código encontrado en el archivo.
Veamos cómo funciona esto y cómo se relaciona con su pregunta sobre las
__name__
comprobaciones que siempre vemos en los scripts de Python.Muestra de código
Usemos una muestra de código ligeramente diferente para explorar cómo funcionan las importaciones y los scripts. Supongamos que lo siguiente está en un archivo llamado
foo.py
.Variables especiales
Cuando el intérprete de Python lee un archivo fuente, primero define algunas variables especiales. En este caso, nos importa la
__name__
variable.Cuando su módulo es el programa principal
Si está ejecutando su módulo (el archivo fuente) como el programa principal, p. Ej.
el intérprete asignará la cadena codificada
"__main__"
a la__name__
variable, es decirCuando su módulo es importado por otro
Por otro lado, suponga que otro módulo es el programa principal e importa su módulo. Esto significa que hay una declaración como esta en el programa principal, o en algún otro módulo que importa el programa principal:
El intérprete buscará su
foo.py
archivo (junto con la búsqueda de algunas otras variantes), y antes de ejecutar ese módulo, asignará el nombre"foo"
de la declaración de importación a la__name__
variable, es decirEjecutando el Código del Módulo
Después de configurar las variables especiales, el intérprete ejecuta todo el código del módulo, una declaración a la vez. Es posible que desee abrir otra ventana al lado con el ejemplo de código para que pueda seguir esta explicación.
Siempre
Imprime la cadena
"before import"
(sin comillas).Carga el
math
módulo y lo asigna a una variable llamadamath
. Esto es equivalente a reemplazarimport math
con lo siguiente (tenga en cuenta que__import__
es una función de bajo nivel en Python que toma una cadena y desencadena la importación real):Imprime la cuerda
"before functionA"
.Ejecuta el
def
bloque, crea un objeto de función y luego asigna ese objeto de función a una variable llamadafunctionA
.Imprime la cuerda
"before functionB"
.Ejecuta el segundo
def
bloque, crea otro objeto de función y luego lo asigna a una variable llamadafunctionB
.Imprime la cuerda
"before __name__ guard"
.Solo cuando su módulo es el programa principal
__name__
efectivamente se configuró en"__main__"
y llama a las dos funciones, imprime las cadenas"Function A"
y"Function B 10.0"
.Solo cuando su módulo es importado por otro
__name__
lo será"foo"
, no"__main__"
, y omitirá el cuerpo de laif
declaración.Siempre
"after __name__ guard"
en ambas situaciones.Resumen
En resumen, esto es lo que se imprimiría en los dos casos:
¿Por qué funciona de esta manera?
Naturalmente, podría preguntarse por qué alguien querría esto. Bueno, a veces desea escribir un
.py
archivo que pueda ser utilizado por otros programas y / o módulos como un módulo, y también puede ejecutarse como el programa principal en sí. Ejemplos:Su módulo es una biblioteca, pero desea tener un modo de script donde ejecute algunas pruebas unitarias o una demostración.
Su módulo solo se usa como programa principal, pero tiene algunas pruebas unitarias, y el marco de prueba funciona importando
.py
archivos como su script y ejecutando funciones de prueba especiales. No desea que intente ejecutar el script solo porque está importando el módulo.Su módulo se utiliza principalmente como programa principal, pero también proporciona una API fácil de usar para programadores para usuarios avanzados.
Más allá de esos ejemplos, es elegante que ejecutar un script en Python solo esté configurando algunas variables mágicas e importando el script. "Ejecutar" el script es un efecto secundario de importar el módulo del script.
Comida para el pensamiento
Pregunta: ¿Puedo tener múltiples
__name__
bloques de verificación? Respuesta: es extraño hacerlo, pero el lenguaje no te detendrá.Supongamos que lo siguiente está adentro
foo2.py
. ¿Qué pasa si dicespython foo2.py
en la línea de comandos? ¿Por qué?__name__
check infoo3.py
:fuente
subprocess.run('foo_bar.py')
un script de Python? Supongo quefoo_bar
eso se iniciará__name__ = '__main__'
al igual que cuando escribofoo_bar.py
cmd manualmente. ¿Es ese el caso? Teniendo en cuenta la respuesta de @MrFooz, no debería haber ningún problema para hacer esto y tener tantos módulos "principales" a la vez como quiera. Incluso cambiar el__name__
valor o tener varias instancias creadas de forma independiente (o instancias que se crearon entre sísubprocess
) interactúan entre sí, debería ser lo habitual para Python. ¿Echo de menos algo?subprocess.run
. Dicho esto, una forma generalmente mejor de compartir código entre scripts es crear módulos y hacer que los scripts llamen a los módulos compartidos en lugar de invocarse entre ellos como scripts. Es difícil depurarsubprocess.run
llamadas ya que la mayoría de los depuradores no saltan los límites del proceso, puede agregar una sobrecarga del sistema no trivial para crear y destruir los procesos adicionales, etc.from foo2 import functionB
importar foo2 desde la función B ? Esa es una contorsión semántica.from module import method
importa el método desde el módulo.multiprocessing
, en particular, hacer que esta prueba sea necesaria en Windows.Cuando su script se ejecuta pasándolo como un comando al intérprete de Python,
todo el código que está en el nivel de sangría 0 se ejecuta. Las funciones y clases que están definidas están, bien, definidas, pero ninguno de sus códigos se ejecuta. A diferencia de otros lenguajes, no hay una
main()
función que se ejecute automáticamente: lamain()
función es implícitamente todo el código en el nivel superior.En este caso, el código de nivel superior es un
if
bloque.__name__
es una variable incorporada que evalúa el nombre del módulo actual. Sin embargo, si un módulo se está ejecutando directamente (como en el casomyscript.py
anterior), en su__name__
lugar, se establece en la cadena"__main__"
. Por lo tanto, puede probar si su script se está ejecutando directamente o si otra cosa lo está importando al probarSi su secuencia de comandos se está importando a otro módulo, se importarán sus diversas funciones y definiciones de clase y se ejecutará su código de nivel superior, pero el código en el cuerpo de la
if
cláusula anterior no se ejecutará ya que la condición es no se cumplen. Como ejemplo básico, considere los siguientes dos scripts:Ahora, si invoca al intérprete como
La salida será
Si corres en su
two.py
lugar:Usted obtiene
Por lo tanto, cuando el módulo
one
se carga, es__name__
igual en"one"
lugar de"__main__"
.fuente
La explicación más simple para la
__name__
variable (imho) es la siguiente:Crea los siguientes archivos.
y
Ejecutarlos te dará esta salida:
Como puede ver, cuando se importa un módulo, Python establece
globals()['__name__']
en este módulo el nombre del módulo. Además, al importar todo el código del módulo se está ejecutando. Como laif
declaración se evalúa aFalse
esta parte no se ejecuta.Como puede ver, cuando se ejecuta un archivo, Python se establece
globals()['__name__']
en este archivo en"__main__"
. Esta vez, laif
declaración se evalúaTrue
y se está ejecutando.fuente
Para resumir los conceptos básicos:
La variable global
__name__
, en el módulo que es el punto de entrada a su programa, es'__main__'
. De lo contrario, es el nombre por el que importa el módulo.Entonces, el código debajo del
if
bloque solo se ejecutará si el módulo es el punto de entrada a su programa.Permite que el código en el módulo pueda ser importado por otros módulos, sin ejecutar el siguiente bloque de código en la importación.
¿Porqué necesitamos esto?
Desarrollando y probando su código
Digamos que está escribiendo un script Python diseñado para ser utilizado como un módulo:
Usted podría probar el módulo mediante la adición de esta llamada de la función a la parte inferior:
y ejecutarlo (en un símbolo del sistema) con algo como:
El problema
Sin embargo, si desea importar el módulo a otro script:
En la importación,
do_important
se llamaría a la función, por lo que probablemente comentaría su llamada a la funcióndo_important()
, en la parte inferior.Y luego tendrá que recordar si ha comentado o no su llamada a la función de prueba. Y esta complejidad adicional significaría que es probable que lo olvide, haciendo que su proceso de desarrollo sea más problemático.
Una mejor manera
La
__name__
variable apunta al espacio de nombres donde sea que esté el intérprete de Python en este momento.Dentro de un módulo importado, es el nombre de ese módulo.
Pero dentro del módulo primario (o una sesión interactiva de Python, es decir, Read, Eval, Print Loop o REPL del intérprete) está ejecutando todo desde él
"__main__"
.Entonces, si verifica antes de ejecutar:
Con lo anterior, su código solo se ejecutará cuando lo esté ejecutando como módulo principal (o lo llame intencionalmente desde otro script).
Una mejor manera
Sin embargo, hay una manera pitónica de mejorar esto.
¿Qué sucede si queremos ejecutar este proceso de negocio desde fuera del módulo?
Si ponemos el código que queremos ejercitar a medida que desarrollamos y probamos una función como esta y luego hacemos nuestra comprobación
'__main__'
inmediatamente después:Ahora tenemos una función final para el final de nuestro módulo que se ejecutará si ejecutamos el módulo como módulo principal.
Permitirá que el módulo y sus funciones y clases se importen a otros scripts sin ejecutar la
main
función, y también permitirá que se llame al módulo (y sus funciones y clases) cuando se ejecute desde un'__main__'
módulo diferente , es decirEste modismo también se puede encontrar en la documentación de Python en una explicación del
__main__
módulo. Ese texto dice:fuente
if __name__ == "__main__"
es la parte que se ejecuta cuando el script se ejecuta desde (digamos) la línea de comandos usando un comando comopython myscript.py
.fuente
helloworld.py
con soloprint("hello world")
en él puede ejecutarse con comandopython helloworld.py
incluso cuando no hayif __name__ == "__main__"
?__name__
es una variable global (en Python, global en realidad significa en el nivel del módulo ) que existe en todos los espacios de nombres. Suele ser el nombre del módulo (comostr
tipo).Sin embargo, como el único caso especial, en cualquier proceso de Python que ejecute, como en mycode.py:
el espacio de nombres global de otra forma anónima se le asigna el valor de
'__main__'
su__name__
.Por lo tanto, incluyendo las líneas finales.
hará
main
que se ejecute la función definida de forma exclusiva de su script .Otro beneficio de usar esta construcción: también puede importar su código como módulo en otro script y luego ejecutar la función principal si su programa decide:
fuente
Aquí hay muchas opiniones diferentes sobre la mecánica del código en cuestión, el "Cómo", pero para mí nada de eso tenía sentido hasta que entendí el "Por qué". Esto debería ser especialmente útil para los nuevos programadores.
Tome el archivo "ab.py":
Y un segundo archivo "xy.py":
Cuando ejecutas
xy.py
, túimport ab
. La declaración de importación ejecuta el módulo inmediatamente en la importación, por lo queab
las operaciones se ejecutan antes que el resto dexy
. Una vez terminado conab
, continúa conxy
.El intérprete realiza un seguimiento de con qué scripts se están ejecutando
__name__
. Cuando ejecuta un script, sin importar cómo lo haya llamado, el intérprete lo llama"__main__"
, convirtiéndolo en el script maestro o 'home' al que se devuelve después de ejecutar un script externo.Cualquier otra secuencia de comandos que se llame desde esta
"__main__"
secuencia de comandos se le asigna su nombre de archivo como su__name__
(por ejemplo,__name__ == "ab.py"
). Por lo tanto, la líneaif __name__ == "__main__":
es la prueba del intérprete para determinar si está interpretando / analizando el script 'inicial' que se ejecutó inicialmente, o si está mirando temporalmente a otro script (externo). Esto le da flexibilidad al programador para que el script se comporte de manera diferente si se ejecuta directamente frente a una llamada externa.Pasemos por el código anterior para comprender lo que está sucediendo, centrándonos primero en las líneas no indentadas y el orden en que aparecen en los scripts. Recuerde que los
def
bloques de función o no hacen nada solos hasta que se los llama. Lo que el intérprete podría decir si murmurara para sí mismo:"__main__"
en la__name__
variable.__name__ == "ab.py"
.a()
; Acabo de enterarme de eso. Imprimiendo ' Una función en un archivo ab '."__main__"
!x()
; ok, imprimiendo ' tarea periférica: podría ser útil en otros proyectos '.if
declaración Bueno, la condición se ha cumplido (la variable__name__
se ha establecido en"__main__"
), así que ingresaré a lamain()
función e imprimiré ' función principal: aquí es donde está la acción '.Las dos líneas inferiores significan: "Si este es el
"__main__"
script o 'home', ejecute la función llamadamain()
". Es por eso que verá undef main():
bloque arriba, que contiene el flujo principal de la funcionalidad del script.¿Recuerdas lo que dije antes sobre las declaraciones de importación? Cuando importa un módulo, no solo lo 'reconoce' y espera más instrucciones: en realidad ejecuta todas las operaciones ejecutables contenidas en el script. Entonces, poner la carne de tu guión en el
main()
función lo pone en cuarentena de manera efectiva, aislándolo para que no se ejecute de inmediato cuando lo importa otro script.Nuevamente, habrá excepciones, pero la práctica común es que
main()
generalmente no se llama externamente. Entonces quizás se esté preguntando una cosa más: si no estamos llamandomain()
, ¿por qué estamos llamando al guión? Esto se debe a que muchas personas estructuran sus scripts con funciones independientes que están diseñadas para ejecutarse independientemente del resto del código en el archivo. Más tarde se les llama en otro lugar del cuerpo del guión. Lo que me lleva a esto:Si, eso es correcto. Estas funciones separadas se pueden invocar desde un script en línea que no está contenido dentro de un
main()
función. Si está acostumbrado (como lo estoy yo, en mis primeras etapas de aprendizaje de programación) a crear scripts en línea que hagan exactamente lo que necesita, e intentará resolverlo nuevamente si alguna vez necesita esa operación nuevamente. Bueno, no estás acostumbrado a este tipo de estructura interna de tu código, porque es más complicado de construir y no es tan intuitivo de leer.Pero ese es un script que probablemente no puede tener sus funciones llamadas externamente, porque si lo hiciera comenzaría a calcular y asignar variables inmediatamente. Y es probable que si intentas reutilizar una función, tu nuevo script esté lo suficientemente relacionado con el anterior como para que haya variables conflictivas.
Al dividir las funciones independientes, obtienes la capacidad de reutilizar tu trabajo anterior al llamarlas a otro script. Por ejemplo, "example.py" podría importar "xy.py" y llamar
x()
, haciendo uso de la función 'x' de "xy.py". (Tal vez es capitalizar la tercera palabra de una cadena de texto dada; crear una matriz NumPy a partir de una lista de números y cuadrarlos; o reducir una superficie 3D. Las posibilidades son ilimitadas).(Como comentario aparte, esta pregunta contiene una respuesta de @kindall que finalmente me ayudó a comprender: el por qué, no el cómo. Lamentablemente, se ha marcado como un duplicado de esta , lo que creo que es un error).
fuente
Cuando hay ciertas declaraciones en nuestro módulo (
M.py
) que queremos que se ejecute cuando se ejecute como principal (no importado), podemos colocar esas declaraciones (casos de prueba, declaraciones impresas) debajo de esteif
bloque.De forma predeterminada (cuando el módulo se ejecuta como principal, no importado), la
__name__
variable se establece en"__main__"
, y cuando se importará, la__name__
variable obtendrá un valor diferente, probablemente el nombre del módulo ('M'
). Esto es útil para ejecutar diferentes variantes de módulos juntos, y separar sus declaraciones de entrada y salida específicas y también si hay casos de prueba.En resumen , use este
if __name__ == "main"
bloque ' ' para evitar que se ejecute (cierto) código cuando se importa el módulo.fuente
En pocas palabras,
__name__
es una variable definida para cada script que define si el script se está ejecutando como módulo principal o si se está ejecutando como un módulo importado.Entonces si tenemos dos guiones;
y
El resultado de ejecutar script1 es
Y el resultado de ejecutar script2 es:
Como puede ver,
__name__
nos dice qué código es el módulo 'principal'. Esto es genial, porque puede escribir código y no tener que preocuparse por problemas estructurales como en C / C ++, donde, si un archivo no implementa una función 'principal', entonces no puede compilarse como un ejecutable y si lo hace, entonces no puede usarse como biblioteca.Supongamos que escribe un script de Python que hace algo grandioso e implementa una gran cantidad de funciones que son útiles para otros fines. Si quiero usarlos, puedo importar su script y usarlos sin ejecutar su programa (dado que su código solo se ejecuta dentro del
if __name__ == "__main__":
contexto). Mientras que en C / C ++ tendría que dividir esas piezas en un módulo separado que luego incluye el archivo. Imagine la situación a continuación;Las flechas son enlaces de importación. Para tres módulos que intentan incluir el código de los módulos anteriores, hay seis archivos (nueve, contando los archivos de implementación) y cinco enlaces. Esto hace que sea difícil incluir otro código en un proyecto en C a menos que se compile específicamente como una biblioteca. Ahora imagínelo para Python:
Usted escribe un módulo, y si alguien quiere usar su código, simplemente lo importa y la
__name__
variable puede ayudar a separar la parte ejecutable del programa de la parte de la biblioteca.fuente
Veamos la respuesta de una manera más abstracta:
Supongamos que tenemos este código en
x.py
:Los bloques A y B se ejecutan cuando estamos en ejecución
x.py
.Pero solo el bloque A (y no B) se ejecuta cuando estamos ejecutando otro módulo,
y.py
por ejemplo, en el quex.py
se importa y el código se ejecuta desde allí (como cuandox.py
se llama a una función eny.py
).fuente
Cuando ejecuta Python de forma interactiva, a la
__name__
variable local se le asigna un valor de__main__
. Del mismo modo, cuando ejecuta un módulo Python desde la línea de comandos, en lugar de importarlo a otro módulo, a su__name__
atributo se le asigna un valor__main__
, en lugar del nombre real del módulo. De esta manera, los módulos pueden ver su propio__name__
valor para determinar por sí mismos cómo se están utilizando, ya sea como soporte para otro programa o como la aplicación principal ejecutada desde la línea de comandos. Por lo tanto, el siguiente idioma es bastante común en los módulos de Python:fuente
Considerar:
Comprueba si el
__name__
atributo del script Python es"__main__"
. En otras palabras, si el programa en sí se ejecuta, el atributo será__main__
, por lo que se ejecutará el programa (en este caso, lamain()
función).Sin embargo, si un módulo usa su script Python
if
, se ejecutará cualquier código fuera de la instrucción, por lo queif \__name__ == "\__main__"
se usa solo para verificar si el programa se usa como módulo o no y, por lo tanto, decide si ejecutar el código.fuente
Antes de explicar algo al respecto
if __name__ == '__main__'
, es importante comprender qué__name__
es y qué hace.__name__
es un DunderAlias : puede considerarse como una variable global (accesible desde módulos) y funciona de manera similar aglobal
.Es una cadena (global como se mencionó anteriormente) como lo indica
type(__name__)
(cediendo<class 'str'>
), y es un estándar incorporado para las versiones Python 3 y Python 2 .No solo se puede usar en scripts, sino que también se puede encontrar tanto en el intérprete como en los módulos / paquetes.
Interprete:
Guión:
test_file.py :
Resultando en
__main__
Módulo o paquete:
somefile.py:
test_file.py:
Resultando en
somefile
Tenga en cuenta que cuando se usa en un paquete o módulo,
__name__
toma el nombre del archivo. La ruta del módulo real o la ruta del paquete no se proporciona, pero tiene su propio DunderAlias__file__
, que lo permite.Debería ver que, dónde
__name__
, dónde está el archivo principal (o programa) siempre devolverá__main__
, y si es un módulo / paquete, o cualquier cosa que se ejecute con algún otro script de Python, devolverá el nombre del archivo donde está se originó a partir de.Ser una variable significa que su valor puede sobrescribirse ("can" no significa "debería"), sobrescribir el valor de
__name__
dará como resultado una falta de legibilidad. Así que no lo hagas, por ningún motivo. Si necesita una variable, defina una nueva variable.Siempre se supone que el valor de
__name__
ser__main__
o el nombre del archivo. Una vez más, cambiar este valor predeterminado causará más confusión de que será bueno, causando problemas más adelante.ejemplo:
Se considera una buena práctica en general incluir los
if __name__ == '__main__'
scripts en.Ahora sabemos el comportamiento de
__name__
cosas se vuelve más claro:Una
if
es una instrucción de control de flujo que contiene el bloque de código que se ejecutará si el valor dado es verdadero. Hemos visto que__name__
puede tomar cualquiera__main__
o el nombre del archivo desde el que se importó.Esto significa que si
__name__
es igual a,__main__
entonces el archivo debe ser el archivo principal y en realidad debe estar ejecutándose (o es el intérprete), no un módulo o paquete importado al script.Si efectivamente
__name__
toma el valor de__main__
lo que esté en ese bloque de código, se ejecutará.Esto nos dice que si el archivo que se está ejecutando es el archivo principal (o si se está ejecutando directamente desde el intérprete), esa condición debe ejecutarse. Si es un paquete, entonces no debería, y el valor no será
__main__
.__name__
también se puede usar en módulos para definir el nombre de un móduloTambién es posible hacer otras cosas, menos comunes pero útiles
__name__
, algunas que mostraré aquí:Ejecutar solo si el archivo es un módulo o paquete:
Ejecutando una condición si el archivo es el principal y otra si no lo es:
También puede usarlo para proporcionar funciones / utilidades de ayuda ejecutables en paquetes y módulos sin el uso complejo de bibliotecas.
También permite ejecutar módulos desde la línea de comandos como scripts principales, lo que también puede ser muy útil.
fuente
Creo que es mejor romper la respuesta en profundidad y en palabras simples:
__name__
: Cada módulo en Python tiene un atributo especial llamado__name__
. Es una variable incorporada que devuelve el nombre del módulo.__main__
: Al igual que otros lenguajes de programación, Python también tiene un punto de entrada de ejecución, es decir, main.'__main__'
es el nombre del ámbito en el que se ejecuta el código de nivel superior . Básicamente, tiene dos formas de usar un módulo de Python: ejecutarlo directamente como un script o importarlo. Cuando un módulo se ejecuta como un script,__name__
se establece en__main__
.Por lo tanto, el valor del
__name__
atributo se establece__main__
cuando el módulo se ejecuta como el programa principal. De lo contrario, el valor de__name__
se establece para contener el nombre del módulo.fuente
Es especial para cuando se llama a un archivo Python desde la línea de comandos. Esto normalmente se usa para llamar a una función "main ()" o ejecutar otro código de inicio apropiado, como el manejo de argumentos de línea de comandos, por ejemplo.
Se podría escribir de varias maneras. Otro es:
No digo que debas usar esto en el código de producción, pero sirve para ilustrar que no hay nada "mágico"
if __name__ == '__main__'
. Es una buena convención para invocar una función principal en archivos Python.fuente
and
.and
se usa para verificar si dos declaraciones booleanas son verdaderas. Como no está interesado en el resultado deland
, unaif
declaración comunica más claramente sus intenciones.El sistema (intérprete de Python) proporciona una serie de variables para los archivos fuente (módulos). Puede obtener sus valores en cualquier momento que desee, así que, centrémonos en la variable / atributo __name__ :
Cuando Python carga un archivo de código fuente, ejecuta todo el código que se encuentra en él. (Tenga en cuenta que no llama a todos los métodos y funciones definidos en el archivo, pero sí los define).
Sin embargo, antes de que el intérprete ejecute el archivo de código fuente, define algunas variables especiales para ese archivo; __name__ es una de esas variables especiales que Python define automáticamente para cada archivo de código fuente.
Si Python está cargando este archivo de código fuente como el programa principal (es decir, el archivo que ejecuta), establece la variable especial __name__ para que este archivo tenga un valor "__main__" .
Si esto se importa desde otro módulo, __name__ se establecerá con el nombre de ese módulo.
Entonces, en su ejemplo en parte:
significa que el bloque de código:
se ejecutará solo cuando ejecute el módulo directamente; el bloque de código no se ejecutará si otro módulo lo está llamando / importando porque el valor de __name__ no será igual a " main " en esa instancia en particular.
Espero que esto ayude.
fuente
if __name__ == "__main__":
es básicamente el entorno de script de nivel superior, y especifica el intérprete que ('Tengo la máxima prioridad para ejecutar primero').'__main__'
es el nombre del ámbito en el que se ejecuta el código de nivel superior. Un módulo__name__
se establece igual que'__main__'
cuando se lee desde una entrada estándar, un script o desde una solicitud interactiva.fuente
He estado leyendo mucho a lo largo de las respuestas en esta página. Yo diría, si sabes la cosa, seguro que entenderás esas respuestas, de lo contrario, todavía estás confundido.
Para ser breve, necesita conocer varios puntos:
import a
la acción realmente ejecuta todo lo que se puede ejecutar en "a"Debido al punto 1, es posible que no desee que todo se ejecute en "a" al importarlo
Para resolver el problema en el punto 2, Python le permite poner una verificación de condición
__name__
es una variable implícita en todos los.py
módulos; cuandoa.py
se importa, el valor de__name__
dela.py
módulo se establece en su nombre de archivo "a
"; cuandoa.py
se ejecuta directamente usando "python a.py
", lo que significa quea.py
es el punto de entrada, entonces el valor__name__
dela.py
módulo se establece en una cadena__main__
Basado en el mecanismo de cómo Python establece la variable
__name__
para cada módulo, ¿sabe cómo lograr el punto 3? La respuesta es bastante fácil, ¿verdad? Ponga una condición si:if __name__ == "__main__": ...
; incluso puede ponerlo si__name__ == "a"
depende de su necesidad funcional¡Lo importante que tiene Python es especial en el punto 4! El resto es solo lógica básica.
fuente
Considerar:
La salida para lo anterior es
__main__
.La declaración anterior es verdadera e imprime "método directo" . Supongamos que si importaron esta clase en otra clase, no imprime "método directo" porque, al importar, se establecerá
__name__ equal to "first model name"
.fuente
fibo.py (un módulo llamado
fibo
)Referencia: https://docs.python.org/3.5/tutorial/modules.html
fuente
La razón por
es principalmente para evitar los problemas de bloqueo de importación que surgirían al importar el código directamente . Desea
main()
ejecutarse si su archivo fue invocado directamente (esa es la__name__ == "__main__"
caso), pero si su código fue importado, entonces el importador debe ingresar su código desde el módulo principal verdadero para evitar problemas de bloqueo de importación.Un efecto secundario es que inicia sesión automáticamente en una metodología que admite múltiples puntos de entrada. Puede ejecutar su programa utilizando
main()
como punto de entrada, pero no tiene que hacerlo . Mientrassetup.py
esperamain()
, otras herramientas usan puntos de entrada alternativos. Por ejemplo, para ejecutar su archivo como ungunicorn
proceso, defina unaapp()
función en lugar de amain()
. Al igual que consetup.py
,gunicorn
importa su código para que no quiera que haga nada mientras se importa (debido al problema de bloqueo de importación).fuente
Esta respuesta es para programadores Java que aprenden Python. Cada archivo Java generalmente contiene una clase pública. Puedes usar esa clase de dos maneras:
Llame a la clase desde otros archivos. Solo tiene que importarlo en el programa de llamadas.
Ejecute la clase de forma independiente, con fines de prueba.
Para el último caso, la clase debe contener un método main () vacío público estático. En Python, este propósito lo cumple la etiqueta globalmente definida
'__main__'
.fuente
El código debajo
if __name__ == '__main__':
solo se ejecutará si el módulo se invoca como un script .Como ejemplo, considere el siguiente módulo
my_test_module.py
:Primera posibilidad: importar
my_test_module.py
en otro móduloAhora si invocas
main.py
:Tenga en cuenta que solo se ejecuta la
print()
instrucción de nivel superior enmy_test_module
.2da posibilidad: invocar
my_test_module.py
como scriptAhora, si se ejecuta
my_test_module.py
como un script de Python, ambasprint()
declaraciones se ejecutarán:fuente
Cada módulo en python tiene un atributo llamado
__name__
. El valor del__name__
atributo es__main__
cuando el módulo se ejecuta directamente, comopython my_module.py
. De lo contrario (como cuando diceimport my_module
), el valor de__name__
es el nombre del módulo.Pequeño ejemplo para explicar en breve.
Podemos ejecutar esto directamente como
Salida
Ahora supongamos que llamamos al script anterior desde otro script
Cuando ejecutas esto
Salida
Por lo tanto, lo anterior es que explica por sí mismo cuando se llama a prueba desde otro script, si el rizo
__name__
entest.py
no ejecutará.fuente
Si este archivo .py es importado por otros archivos .py, el código bajo "la instrucción if" no se ejecutará.
Si este .py se ejecuta
python this_py.py
bajo shell, o se hace doble clic en Windows. se ejecutará el código debajo de "la declaración if".Por lo general, se escribe para pruebas.
fuente
Si el intérprete de Python ejecuta un módulo en particular,
__name__
la variable global tendrá valor"__main__"
Cuando ejecutas este script , puedes verme
una
Si importa este archivo, diga A al archivo B y ejecute el archivo B, entonces
if __name__ == "__main__"
en el archivo A se convierte en falso, por lo que se imprime No puede vermesi
fuente
Todas las respuestas han explicado más o menos la funcionalidad. Pero proporcionaré un ejemplo de su uso que podría ayudar a aclarar aún más el concepto.
Suponga que tiene dos archivos Python, a.py y b.py. Ahora, a.py importa b.py. Ejecutamos el archivo a.py, donde primero se ejecuta el código "import b.py". Antes de que se ejecute el resto del código a.py, el código del archivo b.py debe ejecutarse por completo.
En el código b.py hay un código que es exclusivo de ese archivo b.py y no queremos ningún otro archivo (que no sea el archivo b.py) que haya importado el archivo b.py para ejecutarlo.
Entonces eso es lo que esta línea de código verifica. Si el archivo principal (es decir, b.py) ejecuta el código, que en este caso no lo es (a.py es el archivo principal en ejecución), solo se ejecuta el código.
fuente
Crea un archivo, a.py :
__name__
siempre es igual a__main__
cuando ese archivo se ejecuta directamente mostrando que este es el archivo principal.Cree otro archivo, b.py , en el mismo directorio:
Ejecutarlo. Imprimirá un , es decir, el nombre del archivo que se importa .
Entonces, para mostrar dos comportamientos diferentes del mismo archivo , este es un truco de uso común:
fuente
if name == ' main ':
Vemos si con
__name__ == '__main__':
bastante frecuencia.Comprueba si se está importando un módulo o no.
En otras palabras, el código dentro del
if
bloque se ejecutará solo cuando el código se ejecute directamente. Aquídirectly
significanot imported
.Veamos qué hace usando un código simple que imprime el nombre del módulo:
Si ejecutamos el código directamente
python test.py
, el nombre del módulo es__main__
:fuente
Simplemente, es el punto de entrada para ejecutar el archivo, como la
main
función en el lenguaje de programación C.fuente
if __name__ == "__main__"
bloque. Técnicamente, la parte superior del script ejecutado es el punto de entrada del programa.