2013-05-01 77 views
2

在运行此脚本时,Python的3:无法连接字符串在Python-3

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import socket 
import random 
import os 
import threading 
import sys 

class bot(threading.Thread): 
    def __init__(self, net, port, user, nick, start_chan): 
     self.id= random.randint(0,1000) 
     self.irc = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
     self.irc_connect (net, port) 
     self.irc_set_user(user,nick) 
     self.irc_join(start_chan) 
     self.finnish=False 
     threading.Thread.__init__(self) 

    def run(self): 
     while not self.finnish: 
      serv_data_rec = self.irc.recv (4096) 
      if serv_data_rec.find ("PING") != -1: 
       self.irc.send("PONG"+ serv_data_rec.split() [ 1 ] + "\r\n") 

      elif serv_data_rec.find("PRIVMSG")!= -1: 
       line = serv_data_rec.split("!") [ 0 ] + " :" + serv_data_rec.split(":") [ 2 ] 

       self.irc_log(line) 
       self.irc_message(line) 

    def stop(self): 
     self.finnish = True 
     self.irc_quit() 

    def irc_connect(self, net, port): 
     self.net = net 
     self.port = port 
     self.irc.connect ((net, port)) 

    def irc_set_user(self, user, nick): 
     self.user = user 
     self.nick = nick 
     self.irc.send("NICK " + nick + "\r\n") 
     self.irc.send("USER " + user + "\r\n") 

    def irc_join(self, chan): 
     self.chan = chan 
     self.irc.send("JOIN " + chan + "\r\n") 

    def irc_message(self, msg): 
     self.irc.send("PRIVMSG " + self.chan+" " + msg + " \r\n") 

    def irc_message_nick(self, msg , nick): 
     self.irc.send("PRIVMSG " + self.chan+" " + nick + " " + msg + " \r\n") 

    def irc_ping(self): 
     self.irc.send("PING :" + self.net) 

    def irc_log(self, line): 
     if not os.path.exists("./logs"): 
      os.makedirs("./logs") 
     f = open("./logs/" + self.net + self.chan + "#" + "% s" %self.id,'a') 
     try: 
      f.write(line) 
     finally: 
      f.close() 

    def irc_quit(self): 
     self.irc.send("QUIT\r\n") 

    def irc_quit_msg(self, msg): 
     self.irc.send("QUIT :" + msg + "\r\n") 

def main(): 
    bot_main= bot("irc.freenode.net",6667,"botty botty botty :Python IRC","hello_nick","#martin3333") 
    bot_main.start() 
    while 1: 
     inp = raw_input() 
     if inp =="!QUIT": 
      bot_main.stop() 
      break 
    sys.exit(0) 

if __name__ == '__main__': main() 

我得到以下回溯:

File "./hatebozzer.py", line 84, in <module> 
    if __name__ == '__main__': main() 
File "./hatebozzer.py", line 75, in main 
    bot_main= bot("irc.freenode.net",6667,"botty botty botty :Python IRC","hello_nick","#martin3333") 
File "./hatebozzer.py", line 14, in __init__ 
    self.irc_set_user(user,nick) 
File "./hatebozzer.py", line 43, in irc_set_user 
    self.irc.send("NICK " + nick + "\r\n") 
TypeError: 'str' does not support the buffer interface 

我知道字符串完全地不同的治疗Python 3,但我不想转换字符串或做任何异国情调。 我只想连接它们,所以我在这里错了什么?

+0

这不是连接,'.send()'接收你想要接收的字符串。它只是不喜欢得到一个字符串。 – delnan 2013-05-01 14:57:12

+0

@delnan,但为什么它在Python-2.x中工作呢? – 2013-05-01 14:58:22

+1

请参阅[这个答案](http://stackoverflow.com/a/2411981/264775) - 字符串在Python 3和Python 2之间的处理方式不同。 – thegrinner 2013-05-01 15:01:40

回答

5

send想要一系列bytes作为它的参数。

在Python2中,"NICK " + nick + "\r\n"是一个字节序列。 但在Python3中,它是str,它在Python2中被称为unicode。在Python3中,这不是一个字节序列。

在Python3到str转换成一个字节序列,适用的编码:

("NICK " + nick + "\r\n").encode('utf-8') 

或(遵循最佳实践中,使用的format代替+):

"NICK {n}\r\n".format(n=nick).encode('utf-8') 
+0

TypeError:无法将字节对象隐式转换为str,但我们想要将str转换为字节或不是我们? – 2013-05-01 15:07:18

+1

对不起,我忘记了'str'的​​括号。 – unutbu 2013-05-01 15:09:57

+0

谢谢,但我可能不会爱Python 3 ... ^^ – 2013-05-01 15:11:14

2

的你链接到的代码是而不是 Python 3兼容。

您正尝试将Unicode字符串发送到套接字,该套接字预期代替bytes。该代码还使用raw_input(),它在Python 3中重命名为input

使用Python 2运行该代码。