2016-09-23 2 views
0

J'ai créé un bot de discussion pour Twitch IRC, je peux me connecter et créer des commandes etc etc, mais je ne peux pas utiliser keyboard-interrupt dans l'invite de commande. Je suppose que c'est parce qu'il est coincé dans cette boucle infinie, et je ne sais pas comment résoudre ce problème? Je suis nouveau à la programmation btw!Terminer boucle infinie pour un bot

Voici le code que j'ai dans mon Run.py, openSocket() est défini dans un autre fichier, essentiellement la connexion au serveur. s = socket.socket. La première partie de la boucle while lit essentiellement les messages du serveur, je pense que c'est assez simple pour vous les gars!

s = openSocket() 
joinRoom(s) 
readbuffer = "" 

while True: 
     readbuffer = readbuffer + s.recv(1024).decode("utf-8") 
     temp = str.split(readbuffer, "\n") 
     readbuffer = temp.pop() 

     for line in temp: 
      if "PING" in line: 
       s.send("PONG :tmi.twitch.tv\r\n".encode("utf-8")) 
       print("---SENT PONG---") 
      printMessage(getUser, getMessage, line) 
      message = getMessage(line) 

      for key in commands: 
       command = key 
       if command in message: 
        sendMessage(s, commands[command]) 

((Edit: J'ai aussi ce problème où la connexion au serveur semble temps pour une raison quelconque, je réussi à obtenir garder la connexion avec ping/pong environ 40-45min, mais il. déconnectée à nouveau

EDIT:.

Désolé le message original était super désordre j'ai créé ce pastebin avec le moins de code que je pourrais utiliser pour recréer le problème Si le chat IRC est inactif, il se déconnecte.. , et je ne peux pas l'obtenir pour envoyer 2 pings d'affilée sans aucun message entre les deux, pas sûr si c'est parce qu'il se déconnecte avant le 2ème ping ou à cause du 2ème ping.

Au moins une fois, il s'est déconnecté avant même d'avoir reçu le premier ping du serveur.

Pastebin: pastebin.com/sXUW50sS

+0

Utilisez-vous le multithreading, peut-être implicitement dans 'joinRoom'? Seul le thread principal peut être tué par des signaux. – MisterMiyagi

+0

http://pastebin.com/b3h2Y9BE Ici vous pouvez voir toutes les fonctions que j'ai utilisées pour me connecter au serveur! – imroroyo

+0

Ce n'est pas particulièrement utile. Essayez de créer un [exemple minimal] (http://stackoverflow.com/help/mcve). Êtes-vous sûr que votre boucle avance réellement? Si votre socket n'a pas assez de données, lui demander une taille fixe ('s.recv (1024)') * bloquera *. C'est un appel système bloquant, que vous * ne pouvez pas * abandonner à l'intérieur de python. Cela expliquerait aussi votre délai d'attente. – MisterMiyagi

Répondre

0

Une partie du code que vous avez posté n'a pas grand-chose à faire avec le problème que vous avez décrit.

Ceci est une supposition (bien qu'un éduqué). Dans votre connexion socket vous utilisez probablement try: except: et en utilisant Pokemon approche (capture dois « em all)

chose ici serait de trouver une ligne où vous faites quelque chose comme ceci:

except: 
    pass 

et changer à:

except (KeyboardInterrupt, SystemExit): 
    raise 
except: 
    pass 

Il est évident que je ne veux pas dire ici que votre porgram doit attraper toutes les exceptions et passer comme si rien ne se passait. Le point principal est que vous faites probablement déjà cela (pour des raisons d'i-have-no-idea-why) et vous devriez avoir un traitement spécial pour les erreurs du système.

+1

'KeyboardInterrupt' ne s'étend pas' Exception' donc 'excepté Exception: pass' devrait tout attraper mais laisser Ctrl-C augmenter. – Holloway

+0

http://pastebin.com/b3h2Y9BE Ici vous pouvez voir tout mon fichier INIT où la fonction openSocket() est définie. Comme je l'ai dit je suis un peu nouveau et j'ai suivi un mec sur youtube en faisant cette partie, car il est un peu au-dessus de mon niveau. – imroroyo