2016-09-23 4 views
0

Ich habe einen Chat-Bot für Twitch IRC erstellt, kann ich verbinden und Befehle usw. usw. erstellen, aber ich kann nicht Tastatur-Interrupt in der Eingabeaufforderung verwenden. Ich vermute, dass es daran liegt, dass es in dieser Endlosschleife stecken geblieben ist, und ich weiß nicht, wie ich das beheben soll? Ich bin neu in Programmierung BTW!Endlosschleife für einen Bot

Hier ist der Code, den ich in meiner Run.py, openSocket() in einer anderen Datei definiert ist, im Grunde Verbindung zum Server. s = socket.socket. Der erste Teil in der While-Schleife liest im Grunde nur die Server-Nachrichten, ich denke, es ist ziemlich einfach für euch!

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: Ich habe auch dieses Problem, wo die Verbindung mit dem Server aus irgendeinem Grund zu einer Zeitüberschreitung scheint, dass ich es für etwa 40-45min, mit Ping/Pong halten Verbindung bekommen verwaltet, aber es dann. getrennt wieder

EDIT:.

Leider wurde der ursprüngliche Beitrag Super unordentlich ich diese Pastebin mit der geringsten Menge an Code erstellt habe ich das Problem neu erstellen verwenden könnte Wenn der Chat-inaktiv ist es trennen wird.. , und ich kann es nicht dazu bringen, 2 Pings hintereinander ohne irgendwelche Nachrichten dazwischen zu senden, nicht sicher, ob das daran liegt trennt sich vor dem 2. Ping oder wegen des 2. Ping.

Bei mindestens einer Gelegenheit hat es getrennt, bevor ich den ersten Ping vom Server bekam.

Pastebin: pastebin.com/sXUW50sS

+0

Verwenden Sie Multithreading, möglicherweise implizit in 'JoinRoom'? Nur der Haupt-Thread kann durch Signale getötet werden. – MisterMiyagi

+0

http://pastebin.com/b3h2Y9BE hier können Sie alle Funktionen sehen, die ich verwendet habe, um eine Verbindung zum Server herzustellen! – imroroyo

+0

Das ist nicht besonders hilfreich. Versuchen Sie, ein [minimales Beispiel] zu erstellen (http://stackoverflow.com/help/mcve). Sind Sie sicher, dass Ihre Schleife tatsächlich vorrückt? Wenn Ihr Socket nicht genügend Daten hat, wird * nach * einer festen Größe ('s.recv (1024)') * gefragt. Das ist ein blockierender Systemaufruf, den Sie innerhalb von Python * nicht abbrechen können. Es würde auch Ihre Zeitüberschreitung erklären. – MisterMiyagi

Antwort

0

Teil des Codes, die Sie auf dem Laufenden nicht viel mit Problem, das Sie beschrieben zu tun haben.

Dies ist eine Vermutung (obwohl ein Gebildeter). In Sie Socket-Verbindung verwenden Sie wahrscheinlich try: except: und mit Pokemon Ansatz (Gotta catch ‚em all)

Ding hier wäre eine Linie zu finden, wo Sie so etwas wie dies zu tun sind:

except: 
    pass 

und ändern Sie es zu:

except (KeyboardInterrupt, SystemExit): 
    raise 
except: 
    pass 

Offensichtlich versuche ich hier nicht zu sagen, dass Ihre porgram alle Ausnahmen fangen sollte und passieren wie wenn nichts geschehen. Der Hauptpunkt ist, dass Sie das wahrscheinlich schon tun (für i-have-no-idea-why Gründe) und Sie sollten spezielle Behandlung für Systemfehler haben.

+1

'KeyboardInterrupt' erweitert' Exception' nicht, also 'außer Exception: pass' sollte immer noch alles abfangen, aber Ctrl-C ansteigen lassen. – Holloway

+0

http://pastebin.com/b3h2Y9BE Hier können Sie meine ganze INIT-Datei sehen, wo die Funktion openSocket() definiert ist. Wie gesagt, ich bin ein bisschen neu und ich bin einem Typ auf Youtube gefolgt, der diesen Teil gemacht hat, da er ziemlich weit über meinem Level liegt. – imroroyo