Python 可作为 Windows 服务执行

Python executable as Windows Service

我知道 Whosebug 上有与此类似的主题,但其中 none 有与我相同的问题。大多数问题都在询问如何从 Python 开始服务。我有一个正在创建服务的 .bat 文件,并使用我使用 py2exe 创建的 PythonFile.exe。我收到错误 "Error starting service. The service did not respond to the start or control request in a timely fashion"。该服务没有 运行,但我在 ProcessManager 进程中看到了可执行文件。

要使可执行文件符合服务资格,是否有特定要求?我的可执行文件只是一个 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"

我最终找到了问题的答案。事实上,服务是有要求的。大多数成为服务的脚本或程序在代码之上都有一个包装层来管理处理这些需求。这个包装器最终会调用开发人员的代码,并用不同类型的状态向 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 找到了这个模板。这段代码仍然存在一些问题,因为我收到错误 "Error starting service: The service did not respond to the start or control request in a timely fashion",但它仍然回答了我的问题。事实上,可执行文件需要成为 Windows 服务。