¿Por qué no se ejecuta la función main() cuando inicio un script de Python? ¿Dónde comienza a ejecutarse el script (cuál es su punto de entrada)?

Resuelto asked hace 11 años • 0 respuestas

Tengo este código:

import sys

def random(size=16):
    return open(r"C:\Users\ravishankarv\Documents\Python\key.txt").read(size)

def main():
    key = random(13)
    print(key)

Cuando intento ejecutar el script, no hay errores, pero parece que no sucede nada. Esperaba que imprimiera parte del contenido del archivo clave, pero no se imprime nada.

¿Lo que está mal? ¿Cómo hago para que se ejecute el código?

 avatar Jun 23 '13 11:06
Aceptado

No has llamado a tu función principal en absoluto, por lo que el intérprete de Python no la llamará por ti.

Agregue esto como la última línea para que se llame en todo momento:

main()

O, si usa lo que se ve comúnmente:

if __name__ == "__main__":
    main()

Se asegurará de que se llame a su método principal solo si el intérprete de Python ejecuta ese módulo como código inicial. Más sobre eso aquí: ¿Qué hace si __name__ == "__main__": hacer?

Si desea saber cómo escribir la mejor función 'principal' posible, Guido van Rossum (el creador de Python) escribió sobre ello aquí.

 avatar Jun 23 '2013 04:06

Python no es como otros lenguajes donde llama automáticamente a la main()función. Todo lo que has hecho es definir tu función.

Tienes que llamar manualmente a tu función principal:

main()

Además, es posible que veas esto comúnmente en algún código:

if __name__ == '__main__':
    main()
TerryA avatar Jun 23 '2013 04:06 TerryA

Algo sucede, simplemente no se nota.

Python ejecuta scripts de arriba a abajo. defes una declaración y se ejecuta cuando se encuentra, como cualquier otra declaración. Sin embargo, el efecto de esto es crear la función (y asignarle un nombre), no llamarla . De manera similar, importes una declaración que carga el otro módulo (y hace que su código se ejecute de arriba a abajo, con su propio contexto de variable global) y le asigna un nombre.

Por lo tanto, cuando se ejecuta el código de ejemplo, suceden tres cosas:

  • El código para el sysmódulo de biblioteca estándar se ejecuta y luego el nombre sysen las variables globales de nuestro propio módulo se vincula a ese módulo.

  • Se crea una función a partir del código para randomy luego el nombre randomse vincula a esa función.

  • Se crea una función a partir del código para mainy luego el nombre mainse vincula a esa función.

No hay nada para llamar a las funciones, por lo que no se llaman. Como no se llaman, el código que contienen no se ejecuta; solo se usa para crear las funciones. Como ese código no se ejecuta, el archivo no se lee y no se printedita nada.

No hay nombres de funciones "especiales"

A diferencia de otros lenguajes, a Python no le importa el nombre de una función mainni ninguna otra cosa. No se ejecutará automáticamente.

Como dice el Zen de Python, "Lo explícito es mejor que lo implícito". Si queremos que se llame a una función, tenemos que llamarla. Las únicas cosas que se ejecutan automáticamente son las del nivel superior, porque esas son las instrucciones que damos explícitamente.

El guión comienza en la parte superior.

En muchos guiones del mundo real, es posible que veas una línea que dice if __name__ == '__main__':. Aquí no es "donde comienza el guión". El script se ejecuta de arriba a abajo.

Por favor lea ¿Qué hace si __name__ == "__main__": hacer? para comprender el propósito de dicha ifdeclaración (versión corta: garantiza que parte de su código de nivel superior se omita si alguien más importutiliza este archivo como módulo). No es obligatorio y no tiene ningún tipo de propósito especial de "señalización" para indicar dónde comienza a ejecutarse el código. Es simplemente una afirmación perfectamente normal if, es decir, comprobar una condición ligeramente inusual. Nada requiere que lo uses en un script (aparte de querer verificar lo que verifica) y nada te impide usarlo más de una vez. Nada le impide comprobar si __name__es igual a otros valores (es simplemente... casi con certeza inútil).

Karl Knechtel avatar Oct 01 '2022 18:10 Karl Knechtel

No existe tal mainmétodo en Python, lo que tienes que hacer es:

if __name__ == '__main__':
    main()
alfonso.kim avatar Jun 23 '2013 04:06 alfonso.kim