2010-05-12 8 views
29

Para la opción "q" (dejar de fumar) en mi menú del programa, tengo el siguiente código:¿Hay algún método que indique a mi programa que se cierre?

elif choice == "q": 
    print() 

que funcionó bien hasta que lo puse en un bucle infinito, que mantuvo la impresión de líneas en blanco. ¿Hay algún método que pueda salir del programa? De lo contrario, ¿puedes pensar en otra solución?

+0

para completness, CTRL-c (KeyboardInterrupt) también debe tenerse en cuenta – joaquin

Respuesta

61

Una forma es hacer:

sys.exit(0) 

Tendrá que import sys por supuesto.

Otra forma es break fuera de su bucle infinito. Por ejemplo, usted podría hacer esto:

while True: 
    choice = get_input() 
    if choice == "a": 
     # do something 
    elif choice == "q": 
     break 

Otra forma es poner el bucle principal en una función, y utilizar return:

def run(): 
    while True: 
     choice = get_input() 
     if choice == "a": 
      # do something 
     elif choice == "q": 
      return 

if __name__ == "__main__": 
    run() 

La única razón por la que necesita la función run() cuando se utiliza return es que (a diferencia de algunos otros idiomas) no puede directamente return desde la parte principal de su código Python (la parte que no está dentro de una función).

+1

Para completar: 'raise SystemExit' también funcionaría por sí mismo (aunque no se recomienda). – ChristopheD

+0

@ChristopheD: Opté por omitir la discusión de excepciones, ya que no deberían usarse para el flujo normal del programa. –

+1

excepciones no son tan excepcionales en Python. – tzot

2

Ver sys.exit. Esa función saldrá de su programa con el estado de salida dado.

8

En Python 3 no es una función exit():

elif choice == "q": 
    exit() 
+1

No veo ese en [Funciones incorporadas] (http://docs.python.org/py3k/library/functions.html) - tal vez estás pensando en el de ['sys'] (http://docs.python.org/py3k/library/sys.html)? –

+1

No lo veo tampoco, pero parece funcionar para mí (Python 2.6) – harto

+1

Eso es en realidad una concesión para el modo de intérprete - pruebe 'print (exit)' y vea lo que obtiene. 'quit' es similar. –

11

La manera más efectiva para poner fin a un programa, es llamar

raise SystemExit 

Es lo sys.exitdoes, anyway.

Un simple SystemExit, o con None como un único argumento, establece el código de salida del proceso a cero. Cualquier valor de la excepción no entero (raise SystemExit("some message")) imprime el valor de la excepción a sys.stderr y establece el código de salida a 1. Un valor entero que establece el código de salida del proceso al valor:

$ python -c "raise SystemExit(4)"; echo $? 
4 
2

Tenga en cuenta que las soluciones basadas en sys.exit() o cualquier excepción puede no funcionar en un entorno de subprocesos múltiples.

Dado que exit() en última instancia "solo" genera una excepción, solo saldrá del proceso cuando se invoque desde el hilo principal y la excepción no se interceptará. (doc)

This answer from Alex Martelli para obtener más información.

Cuestiones relacionadas