¿Qué hace if __name__ == “__main__”: hacer en Python?

8 minutos de lectura

Avatar de usuario de Devoted
Dedicado

¿Qué hace esto, y por qué se debe incluir el if ¿declaración?

if __name__ == "__main__":
    print("Hello, World!")

Si está tratando de cerrar una pregunta en la que alguien debería estar usando esta expresión y no lo está, considere cerrarla como un duplicado de ¿Por qué Python ejecuta mi módulo cuando lo importo y cómo lo detengo? en cambio. Para preguntas en las que alguien simplemente no ha llamado a ninguna función, o espera incorrectamente una función llamada main para ser usado como un punto de entrada automáticamente, use ¿Por qué no se ejecuta la función main() cuando inicio un script de Python? ¿Dónde comienza a ejecutarse el script?.

  • Solo para que conste, ¿qué es “principal“: docs.python.org/3/reference/… Y lo que es “nombre“: docs.python.org/3/reference/…

    – Konstantin Burlachenko

    2 de abril de 2021 a las 9:17


  • ¿Cuántos de ustedes han venido aquí porque quieren copiar y pegar ‘if __name__ == “__main__”:’? :-PAGS

    – Aarón John Sabu

    6 sep a las 23:17


  • @AaronJohnSabu curiosamente solo estaba haciendo eso

    – carrera divertida jgh

    8 sep a las 20:16

Avatar de usuario de Adam Rosenfield
adam rosenfield

Cuando su secuencia de comandos se ejecuta pasándola como un comando al intérprete de Python,

python myscript.py

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, bueno, definidas, pero ninguno de sus códigos se ejecuta. A diferencia de otros idiomas, no hay main() función que se ejecuta automáticamente – la main() La 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 bloquear. __name__ es una variable integrada que se evalúa como el nombre del módulo actual. Sin embargo, si un módulo se ejecuta directamente (como en myscript.py arriba), entonces __name__ en su lugar se establece en la cadena "__main__". Por lo tanto, puede probar si su script se está ejecutando directamente o si lo está importando otra cosa probando

if __name__ == "__main__":
    ...

Si 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 entonces del if la cláusula anterior no se ejecutará ya que no se cumple la condición. Como ejemplo básico, considere los siguientes dos scripts:

# file one.py
def func():
    print("func() in one.py")

print("top-level in one.py")

if __name__ == "__main__":
    print("one.py is being run directly")
else:
    print("one.py is being imported into another module")
# file two.py
import one

print("top-level in two.py")
one.func()

if __name__ == "__main__":
    print("two.py is being run directly")
else:
    print("two.py is being imported into another module")

Ahora, si invocas al intérprete como

python one.py

La salida será

top-level in one.py
one.py is being run directly

Si tu corres two.py en cambio:

python two.py

Usted obtiene

top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly

Así, cuando el módulo one se carga, es __name__ es igual "one" en vez de "__main__".

  • Asi que, if __name__ == "__main__": básicamente comprueba si está ejecutando su propio script de python y no lo está importando o algo así.

    – Merp

    18 de febrero de 2021 a las 18:20

  • @Adam Rosenfield Si su script está siendo importado a otro módulo, sus diversas funciones y definiciones de clases serán importadas y su código de nivel superior será ejecutado…. ¿Cuál es el código de nivel superior? ¿El código con la sangría de cero?

    – John

    17 de mayo a las 3:27

Rusia debe eliminar el avatar de usuario de Putin
Rusia debe sacar a Putin

Lo que hace el if __name__ == "__main__": ¿hacer?

Para resumir lo básico:

  • 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 con el que importa el módulo.

  • Por lo tanto, codifique bajo el if El 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 sea importado por otros módulos, sin ejecutar el bloque de código debajo de la importación.


¿Porqué necesitamos esto?

Desarrollo y prueba de su código

Digamos que está escribiendo un script de Python diseñado para usarse como un módulo:

def do_important():
    """This function does something very important"""

pudo pruebe el módulo agregando esta llamada de la función al final:

do_important()

y ejecutarlo (en un símbolo del sistema) con algo como:

~$ python important.py

El problema

Sin embargo, si desea importar el módulo a otro script:

import important

En la importación, el do_important se llamaría a la función, por lo que probablemente comentaría su llamada a la función, do_important()en el fondo.

# do_important() # I must remember to uncomment to execute this!

Y luego tendrá que recordar si ha comentado o no su llamada de 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

los __name__ La variable apunta al espacio de nombres dondequiera que se encuentre 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 principal (o una sesión interactiva de Python, es decir, Read, Eval, Print Loop o REPL del intérprete) está ejecutando todo, desde su "__main__".

Entonces, si verifica antes de ejecutar:

if __name__ == "__main__":
    do_important()

Con lo anterior, su código solo se ejecutará cuando lo esté ejecutando como el módulo principal (o lo llame intencionalmente desde otro script).

Una manera aún mejor

Sin embargo, hay una forma Pythonic de mejorar esto.

¿Qué pasa si queremos ejecutar este proceso comercial desde fuera del módulo?

Si ponemos el código que queremos ejercitar mientras desarrollamos y probamos en una función como esta y luego hacemos nuestra verificación de '__main__' inmediatamente despues:

def main():
    """business logic for when running this module as the primary one!"""
    setup()
    foo = do_important()
    bar = do_even_more_important(foo)
    for baz in bar:
        do_super_important(baz)
    teardown()

# Here's our payoff idiom!
if __name__ == '__main__':
    main()

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 el main función, y también permitirá que el módulo (y sus funciones y clases) se llame cuando se ejecuta desde un diferente '__main__' módulo, es decir

import important
important.main()

Esta expresión también se puede encontrar en la documentación de Python en una explicación de la __main__ módulo. Ese texto dice:

Este módulo representa el ámbito (de otro modo anónimo) en el que se ejecuta el programa principal del intérprete: los comandos se leen desde la entrada estándar, desde un archivo de script o desde un indicador interactivo. Es este entorno en el que la estrofa idiomática de “script condicional” hace que se ejecute un script:

if __name__ == '__main__':
    main()

  • Lo siento, no puede haber ninguna diferencia entre el método mencionado en la sección llamada A Better Way y el método mencionado en la sección denominada An Even Better Way. ¿Podría por favor señalarlo?

    – John

    17 de mayo a las 5:15


  • @ John, no creo que haya una diferencia. El usó A Better Way para ilustrar cómo podemos ejecutar el módulo como un script y An Even Better Way para ilustrar cómo podemos importar el módulo en otro lugar y aún así ejecutarlo.

    – BtLutz

    1 ago a las 19:24

Avatar de usuario de Mark Amery
marca amery

if __name__ == "__main__" es la parte que se ejecuta cuando el script se ejecuta desde (digamos) la línea de comando usando un comando como python myscript.py.

  • Lo siento, no puede haber ninguna diferencia entre el método mencionado en la sección denominada A Better Way y el método mencionado en la sección denominada An Even Better Way. ¿Podría por favor señalarlo?

    – John

    17 de mayo a las 5:15


  • @ John, no creo que haya una diferencia. El usó A Better Way para ilustrar cómo podemos ejecutar el módulo como un script y An Even Better Way para ilustrar cómo podemos importar el módulo en otro lugar y aún así ejecutarlo.

    – BtLutz

    1 ago a las 19:24

Avatar de usuario de Mateen Ulhaq
mateen ulhaq

Que hace if __name__ == "__main__": ¿hacer?

__name__ es una variable global (en Python, global en realidad significa en el nivel de módulo) que existe en todos los espacios de nombres. Suele ser el nombre del módulo (como str escribe).

Sin embargo, como único caso especial, en cualquier proceso de Python que ejecute, como en mycode.py:

python mycode.py

al espacio de nombres global anónimo se le asigna el valor de '__main__' a su __name__.

Así, incluyendo las lineas finales

if __name__ == '__main__':
    main()
  • al final de su secuencia de comandos mycode.py,
  • cuando es el módulo principal de punto de entrada que ejecuta un proceso de Python,

hará que su secuencia de comandos esté definida de forma única main función a ejecutar.

Otro beneficio de usar esta construcción: también puede importar su código como un módulo en otro script y luego ejecutar la función principal cuando su programa lo decida:

import mycode
# ... any amount of other code
mycode.main()

¿Ha sido útil esta solución?