can't concatenate strings in Python-3

when running this script in 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()

I get the following traceback:

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

I know that strings are treated completly differently in Python 3, but I am not trying to convert strings or do anything exotic. I just want to concatenate them, so what did I wrong here?

Answers


send wants a sequence of bytes as its argument.

In Python2, "NICK " + nick + "\r\n" is a sequence of bytes. But in Python3, it is a str, which in Python2 would have been called a unicode. In Python3 this is not a sequence of bytes.

In Python3, to convert the str to a sequence of bytes, apply an encoding:

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

or (to follow best practices, use format instead of +):

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

Need Your Help

How to sort varchar in SQL?

sql ms-access sql-order-by

In SQL ( using Access ), I have following values in a column:

Disable controller based on compiler switch by build configuration

asp.net-mvc-3 c#-4.0 buildconfiguration

I'm using MVC3 and I need to deploy the same website to multiple locations, but with certain controllers disabled. The controllers to disable share the same base controller class.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.