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
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?