Seite 1 von 2

Gut zu wissen

Verfasst: Dienstag 8. November 2005, 10:50
von droptix
Oh danke, gut zu wissen! Dann belassen wir es lieber so, dass allow_none nicht erlaubt ist. Will ja keinen gehackten XML-RPC-Server haben... :twisted:

Ich muss schon sagen, das Ding gefällt mir!

Re: Gut zu wissen

Verfasst: Dienstag 8. November 2005, 16:06
von Leonidas
droptix hat geschrieben:Ich muss schon sagen, das Ding gefällt mir!
Ja, XML-RPC ist ein nettes Spielzeug, jedoch nicht das einzige. So gibt es noch SOAP (die Python-Libs funktionieren zwar, sind aber meiner Meinung nach nicht ganz so gut wie Fredrik Lundhs Arbeit mit XML-RPC), Pyro (wenn du große Anforderungen am Flexibilität hast) und Ice (wenn du große Anforderungen an Geschwindigkeit hast).

Echter Dienst

Verfasst: Mittwoch 9. November 2005, 13:26
von droptix
Der Server soll später als echter Dienst laufen. Egal ob auf UNIX oder Windows. Mein Client wird dann wohl eine reine Windows-Lösung, obwohl sie theoretisch auch unter beiden laufen würde.

Kann ich das Python-Skript für den Server als nativen Windows-Dienst installieren (z.B. mit win32service) oder muss man das mit dem Windows ResKit und srvany.exe machen?

Wie verhält sich win32service -> erzeugt das einen echten Dienst oder startet das lediglich Python als Dienst in Verbindung mit dem zugehörigen Skript? Ich möchte schließlich ein Binary erstellen, dass ohne Python auf dem Server lauffähig ist.

Verfasst: Mittwoch 9. November 2005, 15:17
von Leonidas
Dazu musst du py2exe verwenden, die Programme die du damit generierst, kannst du auch als Services generieren lassen, der Python-Interpreter wird eingebunden und somit ist keine Seperate Python-Installation auf dem Server mehr notwendig. Jedoch solltest du zu diesem Thema in das py2exe Wiki und/oder in die Mailingliste schauen, dort steht alles detailierter.

Unterschied XmlRpcHTTPServer und SimpleXMLRPCServer

Verfasst: Freitag 11. November 2005, 14:36
von droptix
Die .exe Dateien funktionieren :-) Finde ich schon mal sehr gut! Dass man die auch gleich als Service generieren kann, dass ist mir neu -> schau ich mir auf jeden Fall an!

Ich habe gestern noch ein bissel gespielt: Dein Beispiel war ja basierend auf der Python-Standard-Lib xmlrpclib. Dieser XMLRPC-Server kann dem Client "nur" Funktionen/Methoden zur Verfügung stellen, aber keine Klassen.

Nun hab ich bisher noch nicht viel objektorientiertes Python gemacht, da ich aus der PHP-Welt komme, aber seit PHP5 bin ich schon sehr auf den Geschmack gekommen. PHP5 beherrscht nun auch geschützte Klassen, Methoden und Variablen (public, protected, private) – Python jedoch nicht.

-> Deshalb habe ich mir die Lib xmlrpcserver besorgt und diesen "erweiterten" XMLRPC-Server benutzt, weil er auch Klassen zur Verfügung stellen kann. Na gut nicht ganz: er kann Objekte von Klassen zur Verfügung stellen, nicht aber die Klasse selbst... Macht das mehr Sinn als der SimpleXMLRPCServer, der in Python eingebaut ist, wenn ich zunehmend reine OOP-Python-Skripte bauen möchte?

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?