¿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)?
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?
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í.
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()
Algo sucede, simplemente no se nota.
Python ejecuta scripts de arriba a abajo. def
es 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, import
es 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
sys
módulo de biblioteca estándar se ejecuta y luego el nombresys
en 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
random
y luego el nombrerandom
se vincula a esa función.Se crea una función a partir del código para
main
y luego el nombremain
se 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 print
edita nada.
No hay nombres de funciones "especiales"
A diferencia de otros lenguajes, a Python no le importa el nombre de una función main
ni 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 if
declaración (versión corta: garantiza que parte de su código de nivel superior se omita si alguien más import
utiliza 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).
No existe tal main
método en Python, lo que tienes que hacer es:
if __name__ == '__main__':
main()