Почему я получаю TypeError в Threading в Python
У меня есть следующий код, основанный на примере, который я нашел здесь в 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
Ответы
Ответ 1
Ошибка происходит из следующей строки:
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,)
Ответ 2
В последней строке args=(port)
эквивалентно args=port
. Вы должны положить port
в правильный кортеж следующим образом: args=(port,)
.
Ответ 3
Параметр 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()
Ответ 4
Нашел ответ здесь: Аргументы строки Threading Python
Ошибка новичков: (порт) не создает кортеж, мне нужны либо args = (порт), либо args = [порт].