Не удается запустить службу Windows, написанную на Python (win32serviceutil) - PullRequest
17 голосов
/ 20 января 2012

Я пытаюсь запустить простой пример сервиса:

someservice.py:

import win32serviceutil 
import win32service 
import win32event

class SmallestPythonService(win32serviceutil.ServiceFramework):
    _svc_name_ = "SmallestPythonService"
    _svc_display_name_ = "display service"

    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):
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

if __name__=='__main__':
    win32serviceutil.HandleCommandLine(SmallestPythonService)

Когда я бегу

python someservice.py install

все хорошо, и сервис появляется в списке сервисов Windows, но

python someservice.py start

завершается с ошибкой «Ошибка 1053: служба не ответила на запрос запуска или управления своевременно», но задержка отсутствует.

Я гуглил решение, в котором говорилось, что это происходит, когда pythonservice.exe не может найти python27.dll. Это на самом деле не могло, поэтому я добавил C:\Python27 к PATH Теперь pythonservice.exe работает нормально, но Ошибка 1053 все еще там.

Я использую Python 2.7.2 с pywin32 216 в Windows 7 Ultimate с правами администратора.

Ответы [ 5 ]

12 голосов
/ 29 января 2013

Кроме того, спасибо за указание на то, что это может быть проблема с DLL, которая привела меня к поиску правильного решения.

Что вам нужно сделать, это добавить Python27 в SYSTEM PATH, а не в USER PATH, поскольку по умолчанию служба python устанавливается как «LocalSystem» и поэтому при попытке запуска использует SYSTEM PATH переменная - вот почему вы можете запустить его из командной строки, ваш USER PATH правильный.

Надеюсь, это поможет!

3 голосов
/ 20 апреля 2012

Я считаю, что ваша проблема будет решена, если вы измените метод SvcDoRun

с

   def  SvcDoRun(self):
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

на

   def  SvcDoRun(self):
        self.ReportServiceStatus(win32service.SERVICE_RUNNING)
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
2 голосов
/ 02 апреля 2018

У меня также была эта проблема, и я смог ее решить, добавив в мой блок выполнения "__main__" следующее:

if len(sys.argv) == 1:
    servicemanager.Initialize()
    servicemanager.PrepareToHostSingle(RouterService)
    servicemanager.StartServiceCtrlDispatcher()
else:
    win32serviceutil.HandleCommandLine(RouterService)

(Не забудьте импортировать servicemanager вверху файла).

Я считаю, что проблема заключается в том, что диспетчер служб Windows запускает исполняемый файл без аргументов (по умолчанию), и в этом случае приложению необходимо правильно сообщить о запуске службы, SvcDoRun не вызывается автоматически кажется.

Как уже упоминалось, вам нужно сопоставить путь, если вы запускаете его из командной строки. В моем приложении я заморозил службу с помощью cx_freeze и использовал исполняемый файл для установки службы, чтобы были включены все зависимости.

1 голос
/ 27 июля 2016

Еще один полезный совет - добавить следующую строку

sys.frozen = 'windows_exe' # Fake py2exe so we can debug

, прежде чем позвонить

win32serviceutil.HandleCommandLine(...)

Таким образом, вы можете получитьБолее полезная информация от службы о том, что идет не так.

0 голосов
/ 31 июля 2018

Я могу запустить службу, выполнив эти процедуры с использованием Python 3.5 и PyInstaller

...