2008-11-04 63 views
11

我正在嘗試使用pywin32創建一個win32服務。我的主要參考點一直是這個教程:創建一個python win32服務

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

我不明白的是初始化過程,因爲守護進程永遠不會被守護進程()直接初始化,而不是從我的理解它的初始化以下:

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

svc_install,處理initalization,通過調用守護進程。 init()並傳遞一些參數給它。

但是,我如何初始化守護進程對象,而沒有initalizing服務?在我啓動服務之前,我想做一些事情。有沒有人有任何想法?

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

這是一個很棒的教程,閱讀了一下,並得到了一些更多的想法,我會回去實施它們。 Fyi。代碼的格式在Firefox中很搞亂:( – UberJumper 2009-05-25 13:48:46