Seite 2 von 2

Verfasst: Freitag 11. November 2005, 19:17
von Leonidas
XML-RPC Unterstützt keine Objekte. Dazu müsstest du, wie Diez geschrieben hat eher auf CORBA (wahnsinnig umständlich) oder Pyro zurückgreifen. Vielleicht noch Ice.

Verschmelzung von XMLRPC-Server und Windows NT Service

Verfasst: Samstag 19. November 2005, 12:05
von Gast
Was für mich jetzt noch nicht ganz klärt, ob der Einsatz von XmlRpcServer mehr Sinn macht als SimpleXMLRPCServer. Da muss ich einfach mal ein wenig rumspielen...

Nächster Schritt: Deine Aussage, dass py2exe auch Windows NT Services erstellen kann, hat mich gleich total begeistert und ich hab weiter geforscht. Aus den Beispielen von py2exe hab ich einen Beispiel-Dienst gefunden, den ich erfolgreich in eine .exe Datei umgewandelt habe und der sich mit

Code: Alles auswählen

myfile.exe -install -auto
als automatisch startender Dienst installieren (und auch wieder entfernen lässt). Dummerweise macht dieser Dienst nix weiter als ins EventLog zu schreiben.

Nun habe ich einerseits meinen laufenden XMLRPC-Server und andererseits meinen "Leerlauf-Dienst". Nun möchte ich beides verschmelzen und habe das Problem, dass ich nicht weiß, wie ich meinen XMLRPC-Server einmalig nach Starten des Dienstes deklariere und ebenfalls starte. Um alles sauber zu machen, sollte der XMLRPC-Server natürlich auch beim beenden des Dienstes gestoppt werden.

Ich poste hier mal mein Experiment, was nicht funktioniert (der Dienst läuft, aber der XMLRPC-Server ist nicht erreichbar):

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import win32serviceutil
import win32service
import win32event
import win32evtlogutil

class IwanService(win32serviceutil.ServiceFramework):
    _svc_name_ = "IwanService"
    _svc_display_name_ = "IWAN Server"
    _svc_deps_ = ["EventLog"]

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        import servicemanager
        # Write a 'started' event to the event log...
        win32evtlogutil.ReportEvent(self._svc_name_,
                                    servicemanager.PYS_SERVICE_STARTED,
                                    0, # category
                                    servicemanager.EVENTLOG_INFORMATION_TYPE,
                                    (self._svc_name_, ''))

        # wait for being stopped...
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

        # and write a 'stopped' event to the event log.
        win32evtlogutil.ReportEvent(self._svc_name_,
                                    servicemanager.PYS_SERVICE_STOPPED,
                                    0, # category
                                    servicemanager.EVENTLOG_INFORMATION_TYPE,
                                    (self._svc_name_, ''))

        # ---------- xmlrpc server ---------- BEGIN
        import xmlrpcserver

        # settings
        port = 8080

        # create stoppable server
        class StoppableXmlRpcServer(xmlrpcserver.XmlRpcHTTPServer):
            # override serve_forever() method with stop-signal
            def serve_forever(self):
                self.stop = False
                while not self.stop:
                    self.handle_request()

        # function to stop XMLRPC server
        def stop(meta):
            server.stop = True

        # test class
        class testc:
            def testm(self, meta, *args):
                return str(meta)+' '+str(args)

            def testfault(self, meta):
                raise xmlrpclib.Fault(42, "don't panic.")

            def testexception(self, meta):
                raise ValueError

        # instance of the test class
        c = testc()

        # test method
        def testm (meta, *args):
            return str(meta)+' '+str(args)

        # start bootup sequence
        print 'Booting:'
        print ' - Creating a XML-RPC server on port %s' % port
        server = StoppableXmlRpcServer(('localhost', port))
        print ' - Registering methods and classes'
        server.register_class('testc', c)
        server.register('testm', testm)
        server.register('stop', stop)
        print ' - Serving: Booting done.'
        server.serve_forever()
        # ---------- xmlrpc server ---------- END

if __name__ == '__main__':
    # Note that this code will not be run in the 'frozen' exe-file!!!
    win32serviceutil.HandleCommandLine(IwanService)
Jemand eine Idee, wo der Fehler ist? Der Dienst soll natürlich später noch mehr zu tun bekommen... Mir fehlen quasi die "Lücken" für

Code: Alles auswählen

def onServiceStart():
    meinSkript

def onServiceStop():
    meinSkript

def onServiceRun():
    meinSkript
Hat jemand einen Ansatz/eine Lösung oder eine Quelle zum Nachschauen?