为什么我在Python中使用线程中的TypeError
问题描述:
我有下面的代码,它基于我在这里找到的一个例子,但是当我运行它时,出现错误。请帮帮忙,我敢肯定,它很简单:为什么我在Python中使用线程中的TypeError
def listener(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('',port))
sock.settimeout(1) # n second(s) timeout
try:
while True:
data, addr = sock.recvfrom(1024)
print data
except socket.timeout:
print 'Finished'
def startListenerThread(port):
threading.Thread(target=listener, args=(port)).start()
我得到的错误是:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 477, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: listener() argument after * must be a sequence, not int
答
错误从以下行来:
threading.Thread(target=listener, args=(port)).start()
的args
参数需要成为一个序列,我认为你的意图是使用一个元组,但是在圆括号中包装一个值并不能实现这一点。以下是你需要将其更改为什么:
threading.Thread(target=listener, args=(port,)).start()
下面是该差一个简单的例子:
>>> (100) # this is just value 100
100
>>> (100,) # this is a tuple containing the value 100
(100,)
+0
Thanks大家为了答案:一分钟3分,这是压倒性的! – Chris 2011-03-29 22:00:55
答
在最后一行,args=(port)
就等于args=port
。您需要将port
放入适当的元组中,如下所示:args=(port,)
。
答
的args
参数threading.Thread
需要一个元组
threading.Thread(target=listener, args=(port)).start()
请注意,这不是使一些1元的元组的括号,这是逗号:
>>> type((1))
<type 'int'>
>>> type((1,))
<type 'tuple'>
改变上述到
threading.Thread(target=listener, args=(port,)).start()
这个问题的标题应该是一个真正的问题,例如“为什么我会得到”参数,必须是一个序列)创建一个ThreadQ?“。正确的问题名称帮助人们找到正确的问题 – ecerulm 2015-05-27 11:20:26