2008-11-04 10 views
11

Obecnie próbuję utworzyć usługę win32 za pomocą pywin32. Moim głównym punktem odniesienia jest ten poradnik:Tworzenie usługi pyt3 win32

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

Co nie rozumiem jest proces inicjalizacji, ponieważ demon nie jest inicjowany bezpośrednio przez Daemon(), zamiast z mojego zrozumienia jego inicjowane przez następujące:

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

Gdzie svc_install, uchwyty initalization, wywołując demona. init() i przekazanie kilku argumentów.

Ale jak mogę zainicjować obiekt demona, bez inicjalizacji usługi? Chcę zrobić kilka rzeczy, zanim uruchomię usługę. Czy ktoś ma jakieś pomysły?

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

Nie jestem pewien, czy rozumiem pytanie. Czy możesz podać nam przykład tego, co chcesz zrobić, czego powyższy kod nie pozwala? –

Odpowiedz

5

nigdy nie używałem tych interfejsów API, ale kopanie za pomocą kodu, wygląda klasie przeszedł w służy do rejestracji nazwy klasy w rejestrze, więc nie można zrobić żadnej inicjalizacji Twój własny. Ale jest metoda zwana GetServiceCustomOption, które mogą pomóc:

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

+0

Dzięki. To, czego dokładnie szukałem. – UberJumper

8

Właśnie tworzyć proste „jak”, gdzie program jest w jednym module, a obsługa jest w innym miejscu, to używa py2exe stworzyć Win32 usługi, co moim zdaniem jest najlepsze, co możesz zrobić dla użytkowników, którzy nie chcą zepsuć się z interpreteriem pythona lub innymi zależnościami.

Można sprawdzić moje samouczek tutaj: Create win32 services using Python and py2exe

+0

To świetny samouczek, przeczytaj go trochę i uzyskaj jeszcze kilka pomysłów, naprawdę wrócę i wdrożę je. Fyi. Formatowanie kodu jest dość pomieszane w firefoxie :( – UberJumper

+0

@uberjumper: Cieszę się, że go lubię, sprawdzam, dlaczego kod wygląda na pomieszany – markuz

+3

Link jest martwy – filmor