为什么我在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 
+2

这个问题的标题应该是一个真正的问题,例如“为什么我会得到”参数,必须是一个序列)创建一个ThreadQ?“。正确的问题名称帮助人们找到正确的问题 – ecerulm 2015-05-27 11:20:26

错误从以下行来:

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() 

在这里找到答案:Python Threading String Arguments

菜鸟的错误:(端口)不做一个元组,我需要args =(port,)或args = [port]。