Передача аргументов в службу Python - PullRequest
3 голосов
/ 08 июня 2010

Мне нужна помощь с сервисом 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 голосов
/ 09 июня 2010

Я не думаю, что вы можете передать аргумент непосредственно службе.Возможно, вы можете использовать среду (установите переменную среды перед запуском службы и прочитайте ее из службы).

0 голосов
/ 09 июня 2010

Извините, недостаточно информации для ответа на ваш вопрос. Это похоже на приложение.

Единственное, о чем я могу подумать, это просмотреть код метода 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.preetition соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...