我遇到Python线程问题并在参数中发送字符串。
def processLine(line) :
print "hello";
return;
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
其中dRecieved是连接读取的一行的字符串。它调用一个简单的函数,到目前为止只有一个打印“hello”的工作。
但是我收到以下错误
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是我想要传递的字符串的长度,所以我猜它会将其分解为每个字符并尝试传递这样的参数。如果我只是正常调用函数,它工作正常,但我真的想将它设置为一个单独的线程。
答案 0 :(得分:233)
你正在尝试创建一个元组,但你只是用字符串括起来:)
添加额外的',':
dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,)) # <- note extra ','
processThread.start()
或使用括号制作列表:
dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved]) # <- 1 element list
processThread.start()
如果您从堆栈跟踪中注意到:self.__target(*self.__args, **self.__kwargs)
*self.__args
将您的字符串转换为字符列表,并将其传递给processLine
功能。如果你传递一个元素列表,它会将该元素作为第一个参数传递 - 在你的例子中是字符串。
答案 1 :(得分:3)
我希望在这里提供更多背景知识。
首先,方法threading::Thread的的构造函数签名:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
args 是用于目标调用的参数 元组 。默认为()。
其次,Python中的一个tuple
的{{3}}:
空元组由一对空括号组成; 具有一项的元组 是通过在值后加上 来构造的(仅包含一个括号中的单个值)。
另一方面,字符串是字符序列,例如'abc'[1] == 'b'
。因此,即使将字符串发送到args
,即使在括号中(仍然是一个字符串),每个字符也将被视为单个参数。
但是,Python如此集成,并且不像JavaScript那样可以容忍额外的参数。相反,它会抛出TypeError
来投诉。
答案 2 :(得分:0)
from threading import Thread
from time import sleep
def run(name):
for x in range(10):
print("helo "+name)
sleep(1)
def run1():
for x in range(10):
print("hi")
sleep(1)
T=Thread(target=run,args=("Ayla",))
T1=Thread(target=run1)
T.start()
sleep(0.2)
T1.start()
T.join()
T1.join()
print("Bye")