2008-11-04 5 views
11

Ich versuche derzeit, einen Win32-Dienst mit pywin32 zu erstellen. Mein Hauptbezugspunkt hat dieses Tutorial:Erstellen eines Python Win32-Dienstes

http://code.activestate.com/recipes/551780/

Was ich nicht verstehe, ist die Initialisierung, da der Daemon wird nie direkt von Daemon() initialisiert, sondern aus meinem Verständnis seiner von der initialisierte folgende:

mydaemon = Daemon 
__svc_regClass__(mydaemon, "foo", "foo display", "foo description") 
__svc_install__(mydaemon) 

Wo svc_install, die initialisiert Griffe, durch Daemon aufrufen. init() und einige Argumente übergeben.

Aber wie kann ich das Daemon-Objekt initialisieren, ohne den Dienst zu initialisieren? Ich möchte ein paar Dinge tun, bevor ich den Dienst anstelle. Hat jemand irgendwelche Ideen?

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

    def SvcDoRun(self): 
     self.run() 

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

    def start(self): 
     pass 

    def stop(self): 
     self.SvcStop() 

    def run(self): 
     pass 

def __svc_install__(cls): 
    win32api.SetConsoleCtrlHandler(lambda x: True, True) 
    try: 
     win32serviceutil.InstallService(
      cls._svc_reg_class_, 
      cls._svc_name_, 
      cls._svc_display_name_, 
      startType = win32service.SERVICE_AUTO_START 
      ) 
     print "Installed" 
    except Exception, err: 
     print str(err) 

def __svc_regClass__(cls, name, display_name, description): 

    #Bind the values to the service name 
    cls._svc_name_ = name 
    cls._svc_display_name_ = display_name 
    cls._svc_description_ = description 
    try: 
     module_path = sys.modules[cls.__module__].__file__ 
    except AttributeError: 
     from sys import executable 
     module_path = executable 
    module_file = os.path.splitext(os.path.abspath(module_path))[0] 
    cls._svc_reg_class_ = '%s.%s' % (module_file, cls.__name__) 
+0

Ich bin nicht sicher, ob ich die Frage verstehen. Können Sie uns ein Beispiel geben, was Sie tun wollen, was der obige Code nicht zulässt? –

Antwort

5

Ich habe noch nie diese APIs verwendet, sondern durch den Code zu graben, es sieht aus wie die übergebene Klasse verwendet wird, um den Namen der Klasse in der Registrierung zu registrieren, so dass Sie jede Initialisierung nicht tun dein eigenes. Aber es gibt eine Methode GetServiceCustomOption genannt, die helfen können:

http://mail.python.org/pipermail/python-win32/2006-April/004518.html

+0

Danke. Das war genau was ich suchte. – UberJumper

8

Ich schaffe nur eine einfache „wie“, wo das Programm in einem Modul und der Service ist an einem anderen Ort, verwendet es py2exe die win32 zu erstellen Service, der meiner Meinung nach das Beste ist, was Sie für Ihre Benutzer tun können, die sich nicht mit dem Python-Interpreter oder anderen Abhängigkeiten herumschlagen wollen.

Sie können mein Tutorial hier überprüfen: Create win32 services using Python and py2exe

+0

Das ist ein tolles Tutorial, lese es ein bisschen und habe ein paar mehr Ideen, ich werde tatsächlich zurückgehen und sie implementieren. Fyi. Die Formatierung des Codes ist ziemlich durcheinander in Firefox :( – UberJumper

+0

@uberjumper: Ich bin froh zu lesen, dass Sie es mögen. Ich überprüfe, warum der Code vermasselt. – markuz

+3

Der Link ist tot. – filmor