Python: 'Thread' has no attribute 'start_new_thread' *Löst*

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
JimmyAndersson
Inlägg: 26457
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Python: 'Thread' has no attribute 'start_new_thread' *Löst*

Inlägg av JimmyAndersson »

OS: Windows XP.
Python: Version 2.7.6
(Jag hade tidigare v3.nånting installerat, men avinstallerade det och installerade 2.7.6 istället.)


Jag håller på att bli lite tokig på det här...

Så fort jag har med Thread.start_new_thread så ger det felmeddelandet:

"AttributeError: type object 'Thread' has no attribute 'start_new_thread' "


Jag har testat egen kod och även en massa exempel från nätet, men det blir samma sak.


Så här ser nuvarande koden ut:

Kod: Markera allt

#!/usr/bin/python

from socket import *
#import Thread
from threading import Thread

 
def handler(clientsocket, clientaddr):
    print("Accepted connection from: ", clientaddr)
 
    while 1:
        data = clientsocket.recv(1024)
        if not data:
            break
        else:
            print(data)
            msg = "You sent me: %s" % data
            clientsocket.send(msg)
    clientsocket.close()
     
if __name__ == "__main__":
    host = '127.0.0.1'
    port = 23
    buf = 1024
     
    addr = (host, port)
     
    serversocket = socket(AF_INET, SOCK_STREAM)
     
    serversocket.bind(addr)
     
    serversocket.listen(2)
 
    while 1:
        print("Server is listening for connections\n")
        clientsocket, clientaddr = serversocket.accept()
        Thread.start_new_thread(handler, (clientsocket, clientaddr))
    serversocket.close()


Den förra såg ut såhär:

Kod: Markera allt

#!/usr/bin/python

from socket import *
from threading import Thread


test_times = 5
BUFF = 1024
HOST = '127.0.0.1'# must be input parameter @TODO
PORT = 23 # must be input parameter @TODO
def response(key):
    return 'Server response: ' + key

def handler(clientsock,addr):
    while 1:
        data = clientsock.recv(BUFF)
        if not data: break
        print(repr(addr) + ' recv:' + repr(data))
        clientsock.send(response(data))
        print(repr(addr) + ' sent:' + repr(response(data)))
        if "close" == data.rstrip(): break # type 'close' on client console to close connection from the server side

    clientsock.close()
    print(addr, "- closed connection") #log on console

if __name__=='__main__':
    ADDR = (HOST, PORT)
    serversock = socket(AF_INET, SOCK_STREAM)
    serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    serversock.bind(ADDR)
    serversock.listen(5)
    while test_times > 0:
        print('waiting for connection... listening on port', PORT)
        clientsock, addr = serversock.accept()
        print('...connected from:', addr)
        test_times = 0
        try:
            Thread.start_new_thread(handler, (clientsock, addr))
            print(test_times)
            test_times = 0
            
        except Exception as errtxt:
            print(errtxt)
            test_times = 0


Gemensamma nämnaren är att det fungerar ända tills jag ansluter till något av dessa script, som agerar server.
Då dyker felmeddelandet upp.



Någon som vet var 17 felet är? :)
sodjan
EF Sponsor
Inlägg: 43242
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Python: 'Thread' has no attribute 'start_new_thread'

Inlägg av sodjan »

> "AttributeError: type object 'Thread' has no attribute 'start_new_thread' "

Ja, det verkar ju stämma.
I alla i min threading.py, så ingår inte 'start_new_thread' i 'Thread'.

Så det går helt enkelt inte att skriva så där.

Det verkar som att du använder dokumentation för 'thread' men använder (den nyare?) 'threading'.

http://docs.python.org/2/library/thread.html
http://docs.python.org/2/library/threading.html

Objektet 'Thread' i modulen 'threading' är inte detsamma som modulen 'thread'...
Användarvisningsbild
JimmyAndersson
Inlägg: 26457
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: 'Thread' has no attribute 'start_new_thread'

Inlägg av JimmyAndersson »

Ah, så var det ja!
Jag hade totalt missat att det var två olika, dvs 'threading.Thread' och 'thread'.

Efter att ha ändrat
from threading import Thread
till
import thread

och
Thread.start_new_thread(handler, (clientsock, addr))
till
thread.start_new_thread(handler, (clientsocket, clientaddr))
så fungerar trådningen fint.

Tack! :tumupp:


(Om någon testar det första scriptet i mitt förra inlägg:
Det är lite klumpigt gjort, men fungerar efter ändringen ovan.
I princip allt kommer från nätet och jag använder det bara
för att se så jag får igång själva kommunikationen och trådningen.)
sodjan
EF Sponsor
Inlägg: 43242
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Python: 'Thread' has no attribute 'start_new_thread' *Lö

Inlägg av sodjan »

Bra att det fungerar! :-)
Du borde också ha modulerna tillgängliga i ditt system.
När man får ett fel som det där så kan men t.ex göra:

Kod: Markera allt

>>> import thread
>>> help (thread)
Help on built-in module thread:

NAME
    thread
...
...
[en massa text bortaget...]
FUNCTIONS
...
    start_new_thread(...)
        start_new_thread(function, args[, kwargs])
        (start_new() is an obsolete synonym)

        Start a new thread and return its identifier...
Om jag däremot gör:

Kod: Markera allt

>>> from threading import Thread
>>> help (Thread)
...
så saknas 'start_new_thread', exakt så som felmeddelande sa...
Användarvisningsbild
JimmyAndersson
Inlägg: 26457
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: 'Thread' has no attribute 'start_new_thread' *Lö

Inlägg av JimmyAndersson »

Bra förslag.

Jag testade det, men det var nog när jag hade Python version 3 installerat.
Efter en massa felsökning så upptäckte jag att version 2.x och version 3
är helt olika när det gäller dessa moduler.

Exemplen på nätet tar "aldrig" upp vilken version de använt
och då blir det extra rörigt för en nybörjare. :)
sodjan
EF Sponsor
Inlägg: 43242
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Python: 'Thread' has no attribute 'start_new_thread' *Lö

Inlägg av sodjan »

Nej, jag vet inte hur det är med "trean", många verkar hänga kvar vid tvåan...
Det finns en note på denna sidan: http://docs.python.org/2/library/thread.html :

"Note
The thread module has been renamed to _thread in Python 3. The 2to3 tool will automatically adapt imports when
converting your sources to Python 3; however, you should consider using the high-level threading module instead."
Användarvisningsbild
JimmyAndersson
Inlägg: 26457
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: 'Thread' has no attribute 'start_new_thread' *Lö

Inlägg av JimmyAndersson »

Aha, så thread finns kvar i 3an alltså, men omdöpt.


"många verkar hänga kvar vid tvåan..."

Jag gissar att en orsak är att version 3 inte är bakåtkompatibel med tvåan
och att man inte ser någon orsak till att uppgradera.
Visserligen läste jag att..

"it is recommended that you focus on writing good code so that 2.x vs 3.x becomes less of an issue. That includes writing full unit test suites, and getting Unicode right. (Python 3.x is significantly less forgiving than 2.x about Unicode versus bytes issues: This is considered to be a good thing, though it makes porting some software packages fairly annoying.)" Länk till källan.


Nu är jag ganska ny när det gäller Python, men jag är tveksam till om de flesta som fortfarande kör med 2.x
tycker att det är motiverat att börja skriva "bättre kod" med syftet att det ska bli enklare
den dag då de övergår till version 3.

Eller om jag formulerar det såhär:

De som fortfarande kör 2.x har förmodligen ingen orsak att gå över till version 3.x.
Oavsett om de skriver "lätt konverterbar" kod eller "quick and dirty" så fungerar det för deras behov.

Dessutom är (helt naturligt) kunskapen större om 2.x jämfört med 3.x.
Det gör att man som nybörjare gärna håller sig till 2.x. :)



Men visst får man vara beredd på lite trassel om man vill köra python-script
på någon hårdvara där man inte har något annat val än 3.x.
(Jag tänker t.ex på Android-burkar och liknande där mycket ligger "fast".)


Det finns iofs konverteringsverktyg för version 2->3 och 3->2,
men jag vet inte om de alltid ger bra resultat.
Det vore intressant att höra någons erfarenheter av dem.

-
Jag fastnade lite på versions-spåret, men jag tycker det är intressant. :)
sodjan
EF Sponsor
Inlägg: 43242
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Python: 'Thread' has no attribute 'start_new_thread' *Lö

Inlägg av sodjan »

OK. Jag vet inte något om (och har inte forskat i det)
V2 vs. V3, där jag kör finns inte V3'an portad:

Kod: Markera allt

$ 
$ 
$ python
Python 2.7.6 (default, Nov 15 2013, 12:45:17) [DECC] on OpenVMS
Type "help", "copyright", "credits" or "license" for more information.
>>>  Exit 

$ 
$ 
Skriv svar