Seite 1 von 1

Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 17:03
von IGnoXX
hallo zusammen,
ich habe ein problem in python, immer wenn ich eine funktion aufrufe erscheint das hier:

' unsupported operand type(s) for +: 'exceptions.NameError' and 'str' '


hab die funktion in einem try: except reingetan =)



Kann mir jemand sagen was das heisst?

Gruß IGnoXX

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 17:16
von print('python')
Lieber IGnoXX,

War das das einzige was im output stand
Oder war das das einzige?
Zeig mal deinen code :)
Scheint, als hättest du ein plus dahin getan, wo eigentlich
Kein plus hingehört
Wahrscheinlich hast du irgendwie sowas geschrieben:

Code: Alles auswählen

try:
    function()
except NameError + "":
    pass

LG Jan

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 17:31
von IGnoXX
Danke für die Schnelle Antwort !
Das hier ist das Login Packet von einem MMO dessen Server ich gerade Umschreibe :D und wenn ich da bei '#Read general Stats' bin und dort statt name , self.name usw.. umändere kommt immer diese Meldung und ja NUR diese :D Wenns so bleibt wie es ist funktioniert es ohne error :P

Vil hab ich ja was übersehen benutze python erst seit 1-2 wochen =)

Gruß IGnoXX

Code: Alles auswählen

def case_login(self):#Execute Login Packet # 1
      try: 
         username_read = readstring()
         password_read = readstring()
         account_path =  str('Accounts/'+str(username_read)+'.ini')
         global MID_LOGIN
         

         if os.path.exists(account_path) == 0:#Tell Client Account does not exists
            clearbuffer()
            writebyte(MID_LOGIN)
            writebyte(3)
            sendmessage(self.socket)
            return 0

         if (iniReadString(account_path, 'ACCOUNT', 'Password', '')) != password_read:
            #Tell Client Password is wrong
            clearbuffer()
            writebyte(MID_LOGIN)
            writebyte(4)
            sendmessage(self.socket)
            return 0

         for i in players:
            if i.name == username_read:
               #Tell User already logged in
               clearbuffer()
               writebyte(MID_LOGIN)
               writebyte(5)
               sendmessage(self.socket)
               return 0

         #Read General Stats
         name = iniReadString(account_path, 'ACCOUNT', 'Name', '')
         playerid = iniReadReal(account_path, 'ACCOUNT', 'Player ID', 0)
         x = iniReadReal(account_path, 'ACCOUNT', 'X', 0)
         y = iniReadReal(account_path, 'ACCOUNT', 'Y', 0)
         HEALTH = iniReadReal(account_path, 'ACCOUNT', 'HP', 10)
         firme = iniReadReal(account_path, 'ACCOUNT', 'FIRME', 1)
         XP = iniReadReal(account_path, 'ACCOUNT', 'XP', 0)
         Cash = iniReadReal(account_path, 'ACCOUNT', 'Cash', 0)
         Bdmg = iniReadReal(account_path, 'ACCOUNT', 'BDMG', 0)
         Bhp = iniReadReal(account_path, 'ACCOUNT', 'BHP', 0)
         Brep = iniReadReal(account_path, 'ACCOUNT', 'BREP', 0)

         #Tell Client login was Successfully and send general stats
         clearbuffer()
         writebyte(MID_LOGIN)
         writebyte(6)
         writeushort(playerid)
         writestring(name)
         writeushort(x)
         writeushort(y)
         writeint(HEALTH)
         writebyte(firme)
         writedouble(XP)
         writedouble(Cash)
         writebyte(Bdmg)
         writebyte(Bhp)
         writebyte(Brep)
         sendmessage(self.socket)

         #Tell others the clients logged in and send stats
         for i in players:
            if i.socket != self.socket:
               clearbuffer()
               writebyte(MID_LOGIN)
               writebyte(7)
               writeushort(playerid)
               writestring(name)
               writeushort(x)
               writeushort(y)
               writeint(HEALTH)
               writebyte(firme)
               writedouble(XP)
               writedouble(Cash)
               writebyte(Bdmg)
               writebyte(Bhp)
               writebyte(Brep)
               sendmessage(i.socket)

         #Make Others send their general stats to client
         for i in players:
            clearbuffer()
            writebyte(MID_LOGIN)
            writebyte(7)
            writeushort(i.playerid)
            writestring(i.name)
            writeushort(i.x)
            writeushort(i.y)
            writeint(i.HEALTH)
            writebyte(i.firme)
            writedouble(i.XP)
            writedouble(i.Cash)
            writebyte(i.Bdmg)
            writebyte(i.Bhp)
            writebyte(i.Brep)
            sendmessage(self.socket)

         #sleep(1)
         #Change object to the Player object
         start_new_thread( obj_player, (name, playerid, x, y, HEALTH, firme, XP, Cash, Bdmg, Bhp, Brep, self.socket, self.ip, ))
         del self
         exit()
      
      except Exception as e:
         print e +'  '+str(sys.exc_traceback.tb_lineno)

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 17:36
von /me
Hast du mal str(e) versucht?

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 17:39
von BlackJack
``global``, ``del self`` (WTF‽), und ``start_new_thread(…)`` — da sollte man gar nichts versuchen sondern am besten schreiend weglaufen. Möchte nicht wissen wie der Rest aussieht.

Edit: Und diese `clearbuffer()`-, `write*()`-, und `sendmessage()`-Funktionen arbeiten anscheinend auf einem globalen Puffer über den Nachrichten zusammengebastelt und versendet werden. Hm, das Programm verwendet Threads. Das klingt interessant. Kann man nur hoffen das der Programmierer von dem Kram wenigsten „thread local storage” kannte. :-)

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 17:43
von IGnoXX
Ich habe das 'self.' wieder entfernt , es funktioniert wieder =P. Aber ich versteht nicht wieso der Meckert wenn ich self. davor schreibe ... einer eine Idee?

Edit:
@Blackjack Was ist daran Falsch? Nur bei dem Objekt löschen bin ich mir nicht ganz so sicher , scheint zu funktionieren. Ansonsten geht alles wie es soll.

Und irgentwie klingt dein Edit post nach viel sarkasmus ^^

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 18:11
von Sirius3
@IGnoXX: "funktionier wie es soll" ist nur eine Umschreibung für "ich hab es nicht getestet, mach ich am besten auch nicht, weil sonst fliegt mir der Code um die Ohren".
Da wir den Code nicht kennen, können wir auch nur Mutmaßungen über den Rest anstellen.
readstring: ohne Argumente, woher wird da was gelesen? Globaler Zustand?
Zeile 5: die str-Aufrufe sind garantiert überflüssig, Pfade setzt man mit os.path.join zusammen
global MID_LOGIN: Großbuchstaben -> Konstante, also global überflüssig
Zeile 9: exists == 0? exists liefert True oder False.
clearbuffer: Welcher Buffer? Globaler Zustand!!
writebyte: Wohin? Globaler Zustand!!!
sendmessage: Welche message? Globaler Zustand!!!!!!
iniReadString: Mit Dateinamen? Wird da jedesmal eine Datei geladen??!??!
write...: Eine lange Liste von writes. Das schreit nach einer geeigneten Datenstruktur!
for i: Was ist i? Ein Player! Warum heißt die Variable dann nicht player?
start_new_thead: deprecated! threading.Thread benutzen
del self: löschen von lokalen Variablen ist überflüssig!

Das sind alles starke Hinweise, dass da irgendwo ein globales Message-Objekt liegt, mit dem man Nachrichten verschicken kann. Wenn zwei Threads gleichzeitig eine Message erzeugen, und das ist nicht unwahrscheinlich, weil Du ja Threads benutzt, dann kracht das gewaltig. Da ist also noch mehr Sarkasmus angebracht.

Wenn Du die Exception nicht verstümmeln würdest, wüßtest Du auch, was Du falsch machst.

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 18:33
von IGnoXX
@Sirius3: Ich habe die funktion getestet und scheint zu funktionieren. Habe ein objekt erstellt und es ausgegeben. Nach dem del hatte der nix mehr ausgegeben , da ging ich davon aus das es funktioniert.

readstring , writestring sendmessage etc etc.. sind funktionen eines DLLs und ich kann sie jederzeit aufrufen.

Das zu zeile 5, ja das str aussenrum ist eigtl unnötig.

ach das macht der schon automatisch mit der konstante, gut zu wissen danke .

und was steckt hinter True bzw False? ja richtig 1 bzw 0 solltest du doch wissen ..

clearbuffer wie gesagt eine globale funktion die importiert wurde.

writebyte dasselbe

sendmessage dasselbe

inireadstring, nein es wird quasi auf ein buffer geschrieben und am ende in die datei gespeichert(auch importiert aus ner DLL). Aber ich werde bald die python funktionen dafür nutzen da sie viel besser sind.

write..: so ist nunmal die zusammensetzung der DLL.

for i..: ist doch total egal welche variable dahin kommt.

start_new_thread: hm ok, ich schaus mir an. ich benutzte py 2.7 wenn's vil von wissen sein soll.

ich hab das iwie so verstanden das man die objecte so löscht :/ Kannst du mich bitte aufklären wenns falsch ist?

das würde ich ja sicher merken wenns zusammen kracht ^^ jedes spieler objekt empfängt vom clienten die daten die dann ausgewertet werden und evtl wieder abgeschickt werden. Aber du hast mich auf eine idee gebracht es mal nur in einer Schleife laufen zu lassen für alle spieler objekte :D Danke dir =)

Danke das du dir die zeit genommen hast die fehler aufzudecken ! schätz ich sehr!! Aus fehlern lernt man und ich bin noch ein neueinsteiger in die Python Syntax.

Gruß IGnoXX

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 19:10
von BlackJack
@IGnoXX: Das man die Funktionen jederzeit aufrufen kann ändert ja nichts daran das sie offensichtlich auf globalen Zustand operieren, womit man sie dann nicht mehr *jederzeit* aufrufen kann, nämlich nicht über Threads hinweg. Ich erinnere mich auch wieder an diese DLL die aus irgendeiner anderen Sprache/Umgebung stammt und von Python aus benutzt irgendwie komisch aussieht. Das was die kann, könnte man auch einfach in Python implementieren statt sich da eine DLL + Python-Anbindung ans Bein zu binden.

Man vergleicht True und False nicht explizit mit True oder False. Dabei kommt ja sowieso nur wieder True oder False heraus und *das* hatte man auch schon vor dem unnötigen Vergleich.

`iniReadString()` *schreibt* in einen Puffer? Äh…

Namen sind nicht egal. `i` ist der Name für eine ganze Zahl. Insbesondere wenn es die Laufvariable in einer Schleife ist. Ausser Du willst andere Programmierer verwirren und das Programm absichtlich schwerer verständlich machen.

Bezüglich `threading` ist Python 2.7 kein Grund/keine Erklärung. `thread` sollte schon sehr viel länger nicht mehr benutzt werden.

``del`` auf Namen angewendet löscht *Namen* und keine Objekte. Objekte kannst Du nicht löschen. Das passiert automatisch. Vielleicht. Irgendwann. Oder auch nicht. Darum kümmert sich die Speicherverwaltung der Laufzeitumgebung. Und `self` löschen zu wollen wäre sowieso ziemlicher Irrsinn. Das ist das Objekt dessen Methode gerade ausgeführt wird. Man würde sich da den Ast absägen auf dem man sitzt, wenn das ginge.

Man merkt nicht sicher ob's kracht weil man ja insbesondere bei Netzwerkcode und Threads gar nicht alle möglichen Ablaufvarianten abdeckt. Da können aber durchaus Fälle bei sein die fehlerhaft sind, aber die Dir halt *bis jetzt* noch nicht aufgefallen sind. Kann auch sein das die bei *Dir* auch nie auftreten. Dafür aber bei anderen. Und da dann vielleicht auch grundsätzlich immer. Nur weil ein Programm mal gelaufen ist ohne Abstürze oder offensichtlich falsche Ergebnisse heisst noch lange nicht das da keine Fehler enthalten sind.

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 20:26
von IGnoXX
@BlackJack:
in der Funktion existiert nur ein return aus der DLL , in der DLL wird alles Verarbeitet.

Ja ich weiß ,aber danke das du mich darauf aufmerksam machst =)

Ich weiß nicht genau wie das intern abläuft mit dem Erstellen der ini datei aber ich vermute das erstmal alles gesammelt wird was und in welche datei geschrieben werden soll. Am ende beendet man den schreibprozess und die datei wird erstellt.

ja okay verstehe. Ich werde versuchen es mir neu anzueignen =)

ich benutze das ' del self ' nur am ende wenn ich das objekt nicht mehr brauche. Aber danke jetzt weiss ich wieder mehr!

Ja natürlich, das ist klar ! Ich werde einiges umschreiben müssen, danke für die hilfe!

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 21:20
von BlackJack
@IGnoXX: Dein erster Satz ergibt keinen Sinn. Ich habe gerade das Thema zu dieser ”49dll” gesucht und gefunden und nach dem was ich da wiedergefunden habe will man diesen Mist nicht benutzen! Und braucht das auch nicht, denn statt sich eine DLL die für „GameMaker” geschrieben wurde um dort so was grundlegendes wie Sockets für die „Game Maker Language” von diesem Produkt zur Verfügung zu stellen, kann man sich ganz einfach eine Lösung mit Python-Bordmitteln schreiben, denn Python hat ein Modul für Sockets schon in der Standardbibliothek, sowie das `struct`-Modul um Werte in die verschiedenen Binärrepresentationen zu überführen um die dann über das Netz zu schicken.

Zu der Ini-Datei: „read” heisst auf Deutsch *lesen* und sagst dauernd etwas über das *schreiben* in eine Datei. Das ist genau das Gegenteil und entweder ist die Funktion völlig irrsinnig benannt oder Du bringst hier einiges durcheinander.

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 22:25
von IGnoXX
39DLL * . Ja das ist schon sehr veraltet und auch der totale Mist, Stimme ich dir zu. Aber soviel mehr brauch ich erstmal nicht.

Ich habe schon mit den internen Bordmitteln der Sockets von Python rumprobiert, aber bis ich sie vernünftig nutzen kann benutze ich erstmal die DLL.
Das mit dem lesen ist eigtl genau dasselbe prinzip. Du gibst an in welcher Datei , key, section er was auslesen soll. und am ende gibt er das aus fertig.Ist doch nicht so schwer zu verstehen wie die DLL funktioniert.

Ausserdem geht der Thread schon Offtopic. Ich wollte nur lediglich wissen was dieser Error auf sich hat und kein Vortrag von dir auf all die Fehler bzw was ich nutzen nicht benutzen sollte. Versteh das nicht falsch , ich danke dir für die Hilfe aber ich hab nach all dem garnicht direkt gefragt! :)

Thread kann geschlossen werden, meine Frage wurde beantwortet.

Gruß IGnoXX

Re: Error in Python, bräuchte Hilfe

Verfasst: Donnerstag 15. Januar 2015, 22:35
von BlackJack
@IGnoXX: Wir haben schon verstanden was die Funktionen machen, genau das ist ja das Problem das wir das verstanden haben, und wie unterirdisch schlecht diese API ist.

Re: Error in Python, bräuchte Hilfe

Verfasst: Freitag 16. Januar 2015, 11:43
von cofi
IGnoXX hat geschrieben:ich benutze das ' del self ' nur am ende wenn ich das objekt nicht mehr brauche. Aber danke jetzt weiss ich wieder mehr!
Das kann doch das Objekt selbst nicht entscheiden, ob es noch gebraucht wird? Falls doch, ist es eher ein Zeichen, dass es keine Klasse sein sollte (der Rest des Ausschnittes legt das auch nahe).

Und selbst wenn es das koennte, wuerde `del self` nichts bringen, da das Objekt ja noch ausserhalb der Methode existiert (und sehr wahrscheinlich an einen Namen gebunden ist).

Zuletzt: Threads werden hier nicht geschlossen und mit dem on-topic halten wir es nicht sonderlich streng ;)