2011-03-29 22 views
17

我有下面的代碼,它基於我在這裏找到的一個例子,但是當我運行它時,出現錯誤。請幫幫忙,我敢肯定,它很簡單:爲什麼我在Python中使用線程中的TypeError

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?「。正確的問題名稱幫助人們找到正確的問題 – ecerulm 2015-05-27 11:20:26

回答

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

Thanks大家爲了答案:一分鐘3分,這是壓倒性的! – Chris 2011-03-29 22:00:55

8

在最後一行,args=(port)就等於args=port。您需要將port放入適當的元組中,如下所示:args=(port,)

6

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() 
相關問題