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...
Ich muss schon sagen, das Ding gefällt mir!
Windows-App möglich mit win32service, win32pipe und py2exe?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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).droptix hat geschrieben:Ich muss schon sagen, das Ding gefällt mir!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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?
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?
-
- 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
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):
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
Hat jemand einen Ansatz/eine Lösung oder eine Quelle zum Nachschauen?
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
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)
Code: Alles auswählen
def onServiceStart():
meinSkript
def onServiceStop():
meinSkript
def onServiceRun():
meinSkript