将参数传递给python服务

时间:2010-06-08 19:15:22

标签: python service

我需要一些python服务的帮助。

我有一个用Python编写的服务。我需要做的是传递一些论点。让我举个例子来解释它。

假设我有一项服务,除了在日志中写入内容之外什么都不做。我想多次在日志中写相同的东西,所以我使用循环。我想在启动服务时通过循环计数器,但我不知道如何。我用以下方式启动服务:

win32serviceutil.HandleCommandLine(WinService)

我正在寻找像

这样的东西
win32serviceutil.HandleCommandLine(WinService,10)

我并不关心它是如何完成的,只要我可以传递参数。一直试图让这个工作在一天的大部分时间没有运气。此外,该服务不是直接运行,而是导入然后从那里运行。

编辑:

这是一个例子,希望它能清除一些事情。

这是在WindowsService.py中:

import win32serviceutil, win32service, win32event, servicemanager, win32serviceutil

class LoopService(win32serviceutil.ServiceFramework):
    _svc_name_ = "LoopService"
    _svc_description_ = "LoopService"
    _svc_display_name_ = "LoopService" 

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

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

    def SvcDoRun(self):
        i = 0;
        while i < 5:
            servicemanager.LogInfoMsg("just something to put in the log");
            i += 1
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

这是在主脚本中:

import service.WindowsService, win32serviceutil
win32serviceutil.HandleCommandLine(service.WindowsService.LoopService);

现在,循环将执行固定的次数。我想要的是简单地以某种方式将值发送给服务。真的不在乎如何。

2 个答案:

答案 0 :(得分:0)

抱歉,没有足够的信息来回答您的问题。这似乎是特定于应用程序的事情。

我唯一能想到的就是查看win32serviceutil.HandleCommandLine方法和WinService类的代码,以确定哪一个写入日志。然后,您必须创建一个子类并覆盖负责在日志中写入以接收其他参数的方法。最后,您必须将原始类的所有引用都推荐给新类。

- 在问题编辑后添加。

更清晰,但仍然不足。您需要查看 win32serviceutil.HandleCommandLine 并查看它如何调用service.WindowsService.LoopService .__ init__。特别是, HandleCommandLine 如何生成 args 以及如何控制它。

如果你赶时间,你可以这样做:

class LoopService(win32serviceutil.ServiceFramework):
    repetitions = 5
    # ... 

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

    # ...

    def SvcDoRun(self):
        for i in range(self.repetitions):
            servicemanager.LogInfoMsg("just something to put in the log");
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

然后你可以控制在创建新实例之前改变LoopService.repetitions 的重复次数。

import service.WindowsService, win32serviceutil
service.WindowsService.LoopService.repetitions = 10
win32serviceutil.HandleCommandLine(service.WindowsService.LoopService);

这很有效,但很难看。尝试控制 args ,然后相应地设置 self.repetition

答案 1 :(得分:0)

我认为你不能直接将参数传递给服务。您可以使用环境(在启动服务之前设置环境变量并从服务中读取它)。