2016-09-23 129 views
0

我创建了一个聊天机器人Twitch IRC,我可以连接并创建命令等等,但是我不能在命令提示符下使用键盘中断。我怀疑这是因为它陷入了这个无限循环,我不知道如何解决这个问题?我是新来的编程btw!为机器人结束无限循环

这里是我在我的Run.py中的代码,openSocket()是在另一个文件中定义的,基本上连接到服务器。 s = socket.socket. while循环中的第一部分基本上只是读取服务器消息,我认为这对你们来说是非常简单的!

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]) 

((编辑:哪里的服务器的连接,似乎超时不管什么原因我也有这个问题,我设法得到它跟上主让平/乓约40-45min连接,但随后它。再次断开

编辑:

对不起原来的职位是超级凌乱我创造了这个引擎收录与我可以用它来重现问题 最少的代码量。如果IRC聊天是无效的,将断开连接。 ,我无法让它连续发送2个ping,没有任何消息,不知道是否是因为它在第二次ping之前或第二次ping之前断开连接。

至少有一次,即使在我从服务器获得第一次ping之前,它仍然断开连接。

引擎收录:pastebin.com/sXUW50sS

+0

你是否在'joinRoom'中隐式使用多线程?只有主线程可以被信号杀死。 – MisterMiyagi

+0

http://pastebin.com/b3h2Y9BE在这里你可以看到我用来连接服务器的所有功能! – imroroyo

+0

这不是特别有用。请尝试创建[最小示例](http://stackoverflow.com/help/mcve)。你确定你的循环实际上是前进吗?如果您的套接字没有足够的数据,请求它的固定大小('s.recv(1024)')将* block *。这是一个阻塞的系统调用,你不能*在python中放弃。这也可以解释你的超时时间。 – MisterMiyagi

回答

0

部分的代码,你贴没有多大跟你描述的问题。

这是一个猜测(虽然是一个受过教育的人)。在你套接字连接您可能正在使用try: except:和使用Pokemon办法(要去赶“时间)

事情在这里会找到一条线,你正在做的事情是这样的:

except: 
    pass 

,并改变它于:

except (KeyboardInterrupt, SystemExit): 
    raise 
except: 
    pass 

很显然,我并不想在这里说,你应该porgram捕获所有异常,只是传似如果什么都没有发生。主要的一点是,你可能已经在做这个(对于我不知道的原因),你应该对系统错误进行特殊处理。

+1

'KeyboardInterrupt'不扩展'Exception'因此'除了Exception:pass'还应该抓住一切,但让Ctrl-C上升。 – Holloway

+0

http://pastebin.com/b3h2Y9BE在这里你可以看到我的整个INIT文件,其中定义了openSocket()函数。正如我所说我有点新,而且我在YouTube上跟着一些人做这个部分,因为它比我的水平高很多。 – imroroyo