2016-04-07 2 views
2

Я знаю, что в StackOverflow есть похожие темы, но ни одна из них не имеет такой же проблемы, как я. Большинство вопросов задают вопрос о том, как запустить службу с Python. У меня есть .bat-файл, который создает службу, и используя PythonFile.exe, который я создал с помощью py2exe. Я получаю сообщение об ошибке «Ошибка при запуске службы. Служба не ответила на запрос запуска или управления своевременно». Служба не запускается, но я вижу исполняемый файл в процессах ProcessManager.Python исполняемый как служба Windows

Существуют ли особые требования к исполнению для использования в качестве услуги? Мой исполняемый файл - это всего лишь TCP-сервер, спящий (с использованием мьютекса), пока мьютекс не разблокируется.

Мой .bat файл ...

net stop "FabulousAndOutrageousOinkers" 
%SYSTEMROOT%\system32\sc.exe delete "FabulousAndOutrageousOinkers" 
%SYSTEMROOT%\system32\sc.exe create "FabulousAndOutrageousOinkers" binPath= "%CD%\FabulousAndOutrageousOinkers.exe" start= auto 
net start "FabulousAndOutrageousOinkers" 

ответ

3

я в конечном итоге найти ответ на мой вопрос. Фактически существуют требования к сервису. Большинство сценариев или программ, которые становятся сервисами, имеют надводный слой над кодом для управления этими требованиями. Эта оболочка заканчивает вызов кода разработчика и сигнализирует службе Windows о статусах разных типов. Запуск, остановка и т.д ...

import win32service 
import win32serviceutil 
import win32event 

class Service(win32serviceutil.ServiceFramework): 
    # you can NET START/STOP the service by the following name 
    _svc_name_ = "FabulousAndOutrageousOinkers" 
    # this text shows up as the service name in the Service 
    # Control Manager (SCM) 
    _svc_display_name_ = "Fabulous And Outrageous Oinkers" 
    # this text shows up as the description in the SCM 
    _svc_description_ = "Truly truly outrageous" 

    def __init__(self, args): 
     win32serviceutil.ServiceFramework.__init__(self,args) 
     # create an event to listen for stop requests on 
     self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 

    # core logic of the service  
    def SvcDoRun(self): 
     import servicemanager 
     self.ReportServiceStatus(win32service.SERVICE_START_PENDING) 

     self.start() 
     rc = None 

     # if the stop event hasn't been fired keep looping 
     while rc != win32event.WAIT_OBJECT_0: 
      # block for 5 seconds and listen for a stop event 
      rc = win32event.WaitForSingleObject(self.hWaitStop, 5000) 

     self.stop() 

    # called when we're being shut down  
    def SvcStop(self): 
     # tell the SCM we're shutting down 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     # fire the stop event 
     win32event.SetEvent(self.hWaitStop) 

    def start(self): 
     try: 
      file_path = "FabulousAndOutrageousOinkers.exe" 
      execfile(file_path)    #Execute the script 
     except: 
      pass 

    def stop(self): 
     pass 

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

Я нашел этот шаблон из http://www.chrisumbel.com/article/windows_services_in_python. Этот код по-прежнему имеет некоторые проблемы, потому что я получаю сообщение об ошибке «Ошибка при запуске службы: служба не отвечала на запуск или запрос управления своевременно», но она по-прежнему отвечает на мой вопрос. Фактически требования к исполняемому файлу становятся Службой Windows.