首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在Python-3中连接字符串

无法在Python-3中连接字符串
EN

Stack Overflow用户
提问于 2013-05-01 22:54:01
回答 2查看 4.7K关注 0票数 2

在Python-3中运行此脚本时:

代码语言:javascript
复制
#!/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()

我得到了以下回溯:

代码语言:javascript
复制
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

我知道在Python3中对字符串的处理是完全不同的,但我并不想转换字符串或做任何稀奇古怪的事情。我只想将它们连接起来,那么我在这里做错了什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-01 22:58:47

send需要一个bytes序列作为它的参数。

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

在Python3中,要将str转换为字节序列,请应用以下编码:

代码语言:javascript
复制
("NICK " + nick + "\r\n").encode('utf-8')

或者(要遵循最佳实践,请使用format而不是+):

代码语言:javascript
复制
"NICK {n}\r\n".format(n=nick).encode('utf-8')
票数 5
EN

Stack Overflow用户

发布于 2013-05-01 22:58:51

您链接的代码与Python 3不兼容。

您正在尝试将Unicode字符串发送到套接字,而套接字需要bytes。该代码还使用了在Python3中重命名为inputraw_input()

使用Python 2来运行该代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16320500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档