2008-11-04 4 views
11

В настоящее время я пытаюсь создать службу win32 с помощью pywin32. Моя главная точка отсчета была эта обучающая:Создание службы win32 python

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

Что я не понимаю, процесс инициализации, поскольку демон никогда не инициализируется непосредственно Демоном(), а не от моего понимания его инициализируется следующее:

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

Где svc_install, обрабатывает инициализационные, путем вызова демона. init() и передать некоторые аргументы.

Но как я могу инициализировать объект демона, не инициализируя службу? Я хочу сделать несколько вещей, прежде чем начать сервис. У кого-нибудь есть идеи?

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

Я не уверен, что понял вопрос. Можете ли вы привести нам пример того, что вы хотите сделать, что приведенный выше код не позволяет? – 2008-11-05 12:12:01

ответ

5

Я никогда не использовал эту API-интерфейсов, но копаться в коде, это выглядит как класс проходил в используются для регистрации имени класса в реестре, так что вы не можете делать какую-либо инициализации твой собственный. Но есть метод, называемый GetServiceCustomOption, которые могут помочь:

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

+0

Спасибо. То, что я точно искал. – UberJumper 2008-11-05 13:39:35

8

Я просто создать простой «как», где программа находится в одном модуле и обслуживание в другом месте, он использует py2exe создать win32 сервис, который, я считаю, является лучшим, что вы можете сделать для своих пользователей, которые не хотят связываться с интерпретатором python или другими зависимостями.

Вы можете проверить мой учебник здесь: Create win32 services using Python and py2exe

+0

Thats a awesome tutorial, немного почитал его и получил еще несколько идей, я действительно вернусь и реализую их. Fyi. Форматирование кода довольно перепутано в firefox :( – UberJumper 2009-05-25 13:48:46

 Смежные вопросы

  • Нет связанных вопросов^_^