为什么在Python中使用Threading时会出现TypeError错误

17

我有下面这段代码,是在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

2
这个问题的标题应该像一个真正的问题,比如“为什么在创建ThreadQ时会出现“argument after * must be a sequence”错误?”适当的问题名称有助于人们找到正确的问题/答案。 - RubenLaguna
4个回答

51

错误来自以下代码行:

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

args参数需要是一个序列,我认为你的意图是使用元组,但用括号将单个值括起来并不能实现这一点。以下是你需要更改的内容:

args = (single_value,)  # 错误
args = (single_value,)  # 正确
threading.Thread(target=listener, args=(port,)).start()

以下是一个简单的示例,展示它们之间的区别:

>>> (100)  # this is just value 100
100
>>> (100,) # this is a tuple containing the value 100
(100,)

谢谢大家的回答:一分钟内有三个,真是让人感到不知所措! - Chris

8
在最后一行中,args=(port) 等同于 args=port。你需要将 port 放入一个适当的元组中,像这样:args=(port,)

6
< p > threading.Thread 中的 args 参数需要是一个元组

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

请注意,使某个东西成为一个1元组的不是括号,而是逗号。该元素必须包含在一个带有逗号分隔的元组中。
>>> type((1))
<type 'int'>
>>> type((1,))
<type 'tuple'>

将上述内容更改为:

将上述内容更改为

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

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接