Asked By – Anonymous
I have a problem with Python threading and sending a string in the arguments.
def processLine(line) : print "hello"; return;
dRecieved = connFile.readline(); processThread = threading.Thread(target=processLine, args=(dRecieved)); processThread.start();
Where dRecieved is the string of one line read by a connection. It calls a simple function which as of right now has only one job of printing “hello”.
However I get the following error
Traceback (most recent call last): File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner self.run() File "C:\Python25\lib\threading.py", line 446, in run self.__target(*self.__args, **self.__kwargs) TypeError: processLine() takes exactly 1 arguments (232 given)
232 is the length of the string that I am trying to pass, so I guess its breaking it up into each character and trying to pass the arguments like that. It works fine if I just call the function normally but I would really like to set it up as a separate thread.
Now we will see solution for issue: Python Threading String Arguments
You’re trying to create a tuple, but you’re just parenthesizing a string 🙂
Add an extra ‘,’:
dRecieved = connFile.readline() processThread = threading.Thread(target=processLine, args=(dRecieved,)) # <- note extra ',' processThread.start()
Or use brackets to make a list:
dRecieved = connFile.readline() processThread = threading.Thread(target=processLine, args=[dRecieved]) # <- 1 element list processThread.start()
If you notice, from the stack trace:
*self.__args turns your string into a list of characters, passing them to the
function. If you pass it a one element list, it will pass that element as the first argument – in your case, the string.