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

Chr*_*ris 17 python multithreading

我有以下代码,这是基于我在这里找到的一个例子,但是当我运行它时,我得到一个错误.请帮忙,我确定它非常简单:

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()
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

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
Run Code Online (Sandbox Code Playgroud)

And*_*ark 49

错误来自以下行:

threading.Thread(target=listener, args=(port)).start()
Run Code Online (Sandbox Code Playgroud)

args参数必须是一个序列,我觉得你的意图是使用一个元组,但在括号包装单个值不做到这一点.以下是您需要将其更改为:

threading.Thread(target=listener, args=(port,)).start()
Run Code Online (Sandbox Code Playgroud)

这是一个显示差异的简单示例:

>>> (100)  # this is just value 100
100
>>> (100,) # this is a tuple containing the value 100
(100,)
Run Code Online (Sandbox Code Playgroud)


sen*_*rle 8

在最后一行,args=(port)相当于args=port.你需要port像这样投入一个合适的元组:args=(port,).


bgp*_*ter 6

args参数threading.Thread需要是一个元组

threading.Thread(target=listener, args=(port)).start()
Run Code Online (Sandbox Code Playgroud)

请注意,不是那些产生单元素元组的parens,它是逗号:

>>> type((1))
<type 'int'>
>>> type((1,))
<type 'tuple'>
Run Code Online (Sandbox Code Playgroud)

改变上面的

threading.Thread(target=listener, args=(port,)).start()
Run Code Online (Sandbox Code Playgroud)