为什么我在Python中使用Thread获取TypeError

时间:2011-03-29 21:16:35

标签: python multithreading

我有以下代码基于我在SO上找到的示例,但是当我运行它时,我得到一个错误。请帮助,我确定它非常简单:

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

4 个答案:

答案 0 :(得分:48)

错误来自以下行:

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

答案 1 :(得分:8)

在最后一行中,args=(port)相当于args=port。您需要将port放入正确的元组中:args=(port,)

答案 2 :(得分:6)

args threading.Thread参数必须是元组

threading.Thread(target=listener, args=(port)).start()

请注意,使用单元组元组的不是parens,它是逗号:

>>> type((1))
<type 'int'>
>>> type((1,))
<type 'tuple'>

将上述内容更改为

threading.Thread(target=listener, args=(port,)).start()

答案 3 :(得分:3)

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

Rookie错误:(端口)没有组成元组,我需要args =(port,)或args = [port]。