Подтвердить что ты не робот

Почему я получаю 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
4b9b3361

Ответ 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 = [порт].