2016-12-01 2 views
0

Je veux programmer une fonction terminate() qui arrête le programme en cours en fonction de l'entrée de l'utilisateur. En réalité, j'ai eu quelques problèmes avec cela, parfois cela fonctionne avec l'inclusion de sys.exit() dans la fonction, parfois non. Parfois, quit() fonctionne, parfois non. «Parfois» signifie que c'est en fonction de la partie du programme que la fonction terminate() est appelée. Quelle peut être la raison et que peut-on utiliser alternativement?Comment inclure une fonction de programme d'arrêt dans un script en python 3.5

J'ai essayé de reproduire un autre problème ci-dessous: func1() appelle func2() afin de recevoir certaines variables d'entrée. Pendant la procédure de saisie dans func (2), l'utilisateur peut choisir d'entrer 'stop'. Dans ce cas, terminate() est appelé et le programme doit être quitté. Mais ce n'est pas le cas.

Il me semble qu'il revient d'abord à func1() et se termine alors avec un message d'erreur indiquant que le résultat n'est pas itérable. Comment puis-je empêcher ce retour à func1() et arrêter le programme déjà dans terminate()?

import sys 

def func1(): 
    a, b = func2() 
    print('something's brewing and I don't know what it is.') 

def func2(): 
    check = 0 
    while check < 1: 
     x = input('your choice: ') 
     if x == 'stop': 
      terminate('stop') 
      break 
     else: 
      a = x 

     y = input('your choice: ') 
     if y == 'stop': 
      terminate('stop') 
     else: 
      b = y 
     check = 1 
    return a, b 

def terminate(stop): 
    if stop == 'stop': 
     sys.exit() 
     # or quit() 
    else: 
     return False 

print(func1()) 

Un grand merci à l'avance

+0

Votre programme a une erreur de syntaxe dans la première ligne de 'fin()'. Si vous corrigez cela, il ne fonctionne toujours pas car vous n'appelez jamais une fonction. Veuillez donner un code qui reproduit le problème et le tester avant de le poster. – zondo

+0

merci @zondo. J'ai fait quelques amendements. Comme je l'ai décrit les problèmes apparaissent parfois et je ne sais pas comment le reproduire exactement. En espérant que je reçois des informations sur les raisons qui peuvent être. Ce qui est le plus étonnant est le fait que sys.exit() se comporte différemment selon l'endroit où il est appelé. –

Répondre

0

Quant au « revenir en arrière », je ne peux pas vous offrir cependant des conseils, je peux offrir une solution plus propre qui utilise la gestion des erreurs de Python.

Alternative à appeler quit() ou sys.exit():

import sys 

# Declare a custom Exception which you can catch 
class ProcessTerminated(Exception): 
    pass 

def func1(): 
    a, b = func2() 
    print('something's brewing and I don't know what it is.') 

def func2(): 
    check = 0 
    while check < 1: 
     x = input('your choice: ') 
     if x == 'stop': 
      terminate('stop') 
      break 
     else: 
      a = x 

     y = input('your choice: ') 
     if y == 'stop': 
      terminate() 
     else: 
      b = y 
     check = 1 
    return a, b 

def terminate(stop): 
    raise ProcessTerminated() # Raise this and catch it in main 

if __name__ == '__main__': 
    try: 
     print(func1()) 
    except ProcessTerminated: 
     print("Process terminated successfully!")