hallo,
ich übergebe ein dict an einen xmlrpc server und in dem dict ist womöglich eine etwas zu lange zahl, kürzen geht aber nicht
Auf jedenfall krieg ich folgende Fehlermeldung
Traceback (most recent call last):
File "guiC.py", line 96, in uploadKey
wx.LogMessage(self.server.sendKey(newDict))
File "/usr/lib/python2.4/xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.4/xmlrpclib.py", line 1377, in __request
allow_none=self.__allow_none)
File "/usr/lib/python2.4/xmlrpclib.py", line 1029, in dumps
data = m.dumps(params)
File "/usr/lib/python2.4/xmlrpclib.py", line 603, in dumps
dump(v, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 615, in __dump
f(self, value, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 696, in dump_struct
dump(v, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 615, in __dump
f(self, value, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 641, in dump_long
raise OverflowError, "long int exceeds XML-RPC limits"
OverflowError: long int exceeds XML-RPC limits
Jetzt hab ich versucht, das ganze mittels xmlrpclib.Binary zu übertragen, doch da hab ich jetzt irgendwie keine möglichkeit mittels
dict["n"] auf die indizierung drauf zuzugreifen. Dort bekomme ich
Traceback (most recent call last):
File "guiC.py", line 96, in uploadKey
wx.LogMessage(self.server.sendKey(binDict))
File "/usr/lib/python2.4/xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.4/xmlrpclib.py", line 1383, in __request
verbose=self.__verbose
File "/usr/lib/python2.4/xmlrpclib.py", line 1147, in request
return self._parse_response(h.getfile(), sock)
File "/usr/lib/python2.4/xmlrpclib.py", line 1286, in _parse_response
return u.close()
File "/usr/lib/python2.4/xmlrpclib.py", line 744, in close
raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: "exceptions.AttributeError:Binary instance has no attribute '__getitem__'">
Jemand eine Idee, wie man dies lösen kann?!
Gruß
Christian
xmlrpc / long int exceeds XML-RPC limits
Ohne zu sehen was Du da genau machst, kann man nichts genaues sagen. Was schickst Du denn jetzt? Ein Dictionary scheint es ja nicht mehr zu sein. Und wie kodierst Du die zu grosse Zahl?
hm okay. Ich schreibs ma einfach ohne hin und her vom server. Hab da eben was programmiert, da krieg ich auch den Fehler
unserialize funktion (nur zur info, steht in anderer datei)
Fehlermeldung:
Traceback (most recent call last):
File "test.py", line 9, in ?
print bdict["N"]
AttributeError: Binary instance has no attribute '__getitem__'
Mir ist klar, dass ich von dem binary nicht auf die indizierung zuzugreifen,
aber wie schaff ich es wieder zu "decoden" ?! die Methode gibt es ja bei xmlrpc.Binary.decode() ?!
nur mit
edict = xmlrpclib.Binary.decode(bdict) gibt:
edict = xmlrpclib.Binary.decode(bdict)
TypeError: decode() takes exactly 2 arguments (1 given
Inhalt von der datei(dict) silvio:
(lp0
(dp1
S'e'
p2
L65537L
sS'Name'
p3
Vsilvio
p4
sS'Algorithm'
p5
S'RSA'
p6
sS'N'
p7
L60260201460653960515702932700615241773576198967774478812712064737800990995991L
Vielleicht jetzt etwas verständlicher? Die große Zahl ist n long
mfg
unserialize funktion (nur zur info, steht in anderer datei)
Code: Alles auswählen
def unserialize(my_file):
f = file(my_file, 'r')
serial = Unpickler(f)
unserial = serial.load()
f.close()
return unserial
Code: Alles auswählen
import xmlrpclib
adict = unserialize("./public/silvio")[0]
print adict["N"]
bdict = xmlrpclib.Binary(adict)
print bdict["N"]
Traceback (most recent call last):
File "test.py", line 9, in ?
print bdict["N"]
AttributeError: Binary instance has no attribute '__getitem__'
Mir ist klar, dass ich von dem binary nicht auf die indizierung zuzugreifen,
aber wie schaff ich es wieder zu "decoden" ?! die Methode gibt es ja bei xmlrpc.Binary.decode() ?!
nur mit
edict = xmlrpclib.Binary.decode(bdict) gibt:
edict = xmlrpclib.Binary.decode(bdict)
TypeError: decode() takes exactly 2 arguments (1 given
Inhalt von der datei(dict) silvio:
(lp0
(dp1
S'e'
p2
L65537L
sS'Name'
p3
Vsilvio
p4
sS'Algorithm'
p5
S'RSA'
p6
sS'N'
p7
L60260201460653960515702932700615241773576198967774478812712064737800990995991L
Vielleicht jetzt etwas verständlicher? Die große Zahl ist n long
mfg
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Christian!dankegut hat geschrieben:ich übergebe ein dict an einen xmlrpc server und in dem dict ist womöglich eine etwas zu lange zahl, kürzen geht aber nicht
Wandle vorher die Zahl in einen String um. Übertrage das Ding vom Server zum Client und wandle es dann am Client wieder von einem String in eine Zahl zurück. Vergiss "Binary" für so etwas. Man kann seitenlange Texte übertragen, dann geht eine umgewandelte Zahl auch.
Aber das Handling von Binary ist auch nicht schwer:
Code: Alles auswählen
>>> import xmlrpclib
>>> b = xmlrpclib.Binary(99999999999999999999999999999999999999999999999999999999999)
>>> b.data
99999999999999999999999999999999999999999999999999999999999L
>>>
Aber damit bist du nicht mehr unabhängig von der Programmiersprache des Clients. Besser, du übergibst die lange Zahl als String.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
hm.. alles klar. Das Problem liegt aber daran, dass ich ein dict übergeben MUSS. Ich komm da leider nicht drumherum, da ich sonst 2 an sich gleiche Methoden schreiben muss, für jeweils RSA und ElGamal (werden einmal 4 und einmal 5 Werte übergeben) Dadurch würde sich, wenn ich es einzeln übertragen würde, die Methode anders aussehen.
Gibt es da was, das binary vom dict das an den Server geschickt wird wieder zu decoden und mit dem server auf die Attribute des dict zuzugreifen?! Das ist gerade mein Hauptproblem.
gruss christian
Gibt es da was, das binary vom dict das an den Server geschickt wird wieder zu decoden und mit dem server auf die Attribute des dict zuzugreifen?! Das ist gerade mein Hauptproblem.
gruss christian
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Christian!dankegut hat geschrieben:Das Problem liegt aber daran, dass ich ein dict übergeben MUSS.
Was ich eigentlich meinte: Wandle deine Zahl bereits im Dictionary in einen String um. Einfach ein
Code: Alles auswählen
xydict["diezahl"] = str(xydict["diezahl"])
Code: Alles auswählen
xydict["diezahl"] = long(xydict["diezahl"])
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
aber ich verstehe dich Damit umgehe ich den long int exceeds xml-rpc limits error. Und ich denke ich darf die Zahl auch hin und her casten.Wenn du das auch nicht darfst, dann verstehe ich die Welt nicht mehr.
Hatte es erst irgendwie nich so ganz verstanden. Danke für deine Hilfe.
Gruß
Christian