Windows-App möglich mit win32service, win32pipe und py2exe?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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?
Antworten