Seite 1 von 1

xmlrpclib ohne HTTP verwenden?

Verfasst: Sonntag 22. April 2007, 23:40
von wdsl
Hi,
weiß einer wie ich xmlrpclib mit Strings verwenden kann (bzw. mit Pipes aber Strings genügen mir bekomme ich ja bei den Pipes)

vielen Dank
wdsl

Verfasst: Montag 23. April 2007, 09:33
von BlackJack
Du könntest mit den `dumps` und `loads`-Funktionen selbst etwas basteln. Wenn auf beiden Seiten Python läuft, dann würde ich aber eher das `pickle`-Modul benutzen. Oder wenn es sprachunabhängiger sein soll JSON als Zwischenformat.

Verfasst: Montag 23. April 2007, 12:25
von mitsuhiko
BlackJack hat geschrieben:...würde ich aber eher das `pickle`-Modul benutzen.
Aua. :shock: Wenn er das über das Netzwerk nutzen will ist das eine verdammt schlechte idee.

Verfasst: Montag 23. April 2007, 12:50
von BlackJack
Warum? Ist auf jeden Fall nicht so aufegbläht wie das XML-RPC-XML und kann auch mehr Datentypen serialisieren.

Re: xmlrpclib ohne HTTP verwenden?

Verfasst: Montag 23. April 2007, 13:31
von gerold
wdsl hat geschrieben:weiß einer wie ich xmlrpclib mit Strings verwenden kann (bzw. mit Pipes aber Strings genügen mir bekomme ich ja bei den Pipes)
Hi wdsl!

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
import xmlrpclib


class MyMethods(object):
    
    def get_hallo(self, name):
        return u"Hallo %s" % name


def main():
    # Dispatcher vorbereiten und Instanz mit Methoden an Dispatcher binden
    dispatcher = SimpleXMLRPCDispatcher()
    dispatcher.register_instance(MyMethods())
    
    for i in range(3): # nur zum Testen :-)
        # XML-Anfrage erstellen und vom Dispatcher beantworten lassen
        xmlcall = xmlrpclib.dumps(("Gerold",), "get_hallo")
        xmlretval = dispatcher._marshaled_dispatch(xmlcall)
        
        # XML-Rückgabe parsen und Rückgabe ausgeben
        print xmlrpclib.loads(xmlretval)[0][0]


if __name__ == "__main__":
    main()
Jetzt musst du die Aufrufe nur noch durch Pipes schleusen und von STDIN annehmen. Z.B. mit ``subprocess`` und ``sys.stdin``.

mfg
Gerold
:-)

Verfasst: Montag 23. April 2007, 17:17
von birkenfeld
blackbird hat geschrieben:
BlackJack hat geschrieben:...würde ich aber eher das `pickle`-Modul benutzen.
Aua. :shock: Wenn er das über das Netzwerk nutzen will ist das eine verdammt schlechte idee.
Was spricht gegen Protokoll 0 oder Protokoll 2.encode("base64")?

Verfasst: Montag 23. April 2007, 17:30
von BlackJack
Was spricht gegen Protokoll 2 ohne Base64-Kodierung? Können Pipes nur ASCII übertragen? Sitzt da ein kleines Monster das die die höchstwertigen Bits frisst!? ;-)

Verfasst: Montag 23. April 2007, 17:59
von wdsl
naja ich habe mir jetzt ne eigene Transporter klasse geschrieben das geht soweit aber danke für die Hilfe.

mfg
wdsl

Verfasst: Dienstag 24. April 2007, 08:41
von mitsuhiko
birkenfeld hat geschrieben:Was spricht gegen Protokoll 0 oder Protokoll 2.encode("base64")?
Ich meinte eher der Sicherheit wegen. Pickle ist jetzt nicht so das hammer sichere Protokoll :-)

Verfasst: Dienstag 24. April 2007, 13:11
von Mephisto
Aber nur wenn die gepickelten Daten aus einer nicht vertrauenswürdigen Quelle kommen.

greets meph