2010-01-24 15 views
10

Esta es la pregunta de novato más grande del planeta, pero no estoy seguro. He escrito un conjunto de funciones que realizan algunas tareas, y quiero una función "principal" que, por ejemplo, cuando llamo "someProgram.py", ejecuto function1, function2 y quit. Recuerdo vagamente algo sobre "principal", pero no tengo ni idea.Después de dividir un programa python en funciones, ¿cómo hago que una sea la función principal?

+2

+1 ¡Es una pregunta increíble para novatos! –

Respuesta

12

scripts de Python no son colecciones de funciones, sino más bien colecciones de declaraciones - de función y de clase definiciones son sólo declaraciones que se unen los nombres de función o de clase objetos.

Si coloca una instrucción de impresión en la parte superior o en la mitad de su programa, se ejecutará normalmente sin estar en ninguna función. Lo que esto significa es que podrías poner todo el código principal al final del archivo y se ejecutará cuando se ejecute el script. Sin embargo, si su script alguna vez es importado en lugar de ejecutarse directamente, ese código también se ejecutará. Por lo general, esto no es lo que quieres, así que deberías evitarlo.

Python proporciona la variable global __name__ para diferenciar cuando un script se importa y ejecuta directamente: se establece en el nombre con el que se ejecuta el script. Si el script se importa, será el nombre del archivo de script. Si se ejecuta directamente, será "__main__". Entonces, puede poner un if __name__ == '__main__': en la parte inferior de su programa, y ​​todo dentro de este bloque si se ejecutará solo si el script se ejecuta directamente.

Ejemplo.

if __name__ == "__main__": 
    the_function_I_think_of_as_main() 
+1

Sentí la necesidad de agregar a esta excelente respuesta. –

+0

+1. '__name__' es en realidad el nombre del módulo" actual "que funciona (no accidentalmente, estoy seguro) convenientemente para' __main__' (que es especial, pero sigue siendo un módulo). Esto es práctico combinado con el registro o http://stackoverflow.com/questions/2000861/retrieve-module-object-from-stack-frame/2011168#2011168 –

1

Es el siguiente lenguaje:

if __name__ == "__main__": 
    yourfoo() 

Also read this.

2
if __name__ == '__main__': 
    run_main() 
+0

Esto realmente no responde la pregunta tal como está escrita, está respondiendo "¿cómo hago para que mi función principal no se ejecute cuando se importa mi módulo?". Si ya tiene una función 'run_main', todo lo que necesita hacer es llamarlo. La respuesta de Max S es preferible a mí. –

3

Cuando un módulo de Python se importa por primera vez, es el bloque principal se ejecuta. Se puede distinguir entre ser dirigido por sí mismo y que se importa en otro programa:

if __name__ == "__main__": 
    function1() 
    function2() 
else: 
    # loaded from another module 
1

Cuando leo su pregunta, usted pregunta cómo definir una función principal. Que realmente se llevaría a cabo con algo como:

def main(): 
    function1() 
    function2() 
    return 0 

Y allí tendría que poner el código algo así como funciones de todo esto de tu archivo principal en el exterior:

if __name__ == "__main__": 
    sys.exit(main()) 

(Por supuesto, usted necesita un import sys algún lugar de la arriba para trabajar.)

A (ahora es un poco viejo, pero sigue siendo relevante) post from Guido dice más.

+1

'return 0'? Esto es Python, no C :). –

+0

¿Cuál es el problema? No causa ningún error y le dice al sistema operativo que saliste sin falla, por lo que se considera una buena práctica en al menos algunos círculos. – GreenMatt

+0

Lo sentimos, tienes razón. No lo leí en el contexto de 'sys.exit'. –

Cuestiones relacionadas