2008-11-04 59 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