2014-05-08 49 views
7

我使用这里找到模板:Is it possible to run a Python script as a service in Windows? If possible, how?部署瓶的应用程序作为Windows服务

这里是我的run.py,我已经安装了如下在上面的链接指令的服务。

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask App" 

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

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

    def SvcDoRun(self): 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
           servicemanager.PYS_SERVICE_STARTED, 
           (self._svc_name_,'')) 
     self.main() 

    def main(self): 
     app.run(host = '192.168.1.6') 

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

然而,当我尝试启动服务,我得到的消息:

“本地计算机上的瓶应用服务启动,然后停止 一些服务自动停止,如果他们不使用的。其他服务或程序“。

任何想法我做错了什么?我尝试了各种用户帐户 - 我不认为这是一个权限问题。

谢谢!

回答

5

我不能在request之外访问Flask的WSGIRequestHandler,所以我用Process

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
from multiprocessing import Process 

from app import app 


class Service(win32serviceutil.ServiceFramework): 
    _svc_name_ = "TestService" 
    _svc_display_name_ = "Test Service" 
    _svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe" 

    def __init__(self, *args): 
     super().__init__(*args) 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     self.process.terminate() 
     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 

    def SvcDoRun(self): 
     self.process = Process(target=self.main) 
     self.process.start() 
     self.process.run() 

    def main(self): 
     app.run() 


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

感谢您的代码示例!我已经成功地使用它来在Windows服务器上_deploy_。然而,我得到**内部服务器错误**,只能用'os.chdir(os.path.dirname(os.path.realpath(__ file__))解决)) ' - 问题在于以下内容,脚本是从一些'win32'文件夹(作为服务)运行的,所以加载任何文件(预计在脚本的'dir'中)都会导致错误。 – quapka

2

想通了 - 我在app.run()中保留了调试选项。一旦我删除了,这是很好的去!

服务启动并正常运行(我可以从网络上的另一台计算机访问我的烧瓶应用程序),但无法停止。在使用发布的模板的线程中,作者提到了设置标志以正确停止服务的一些内容。

任何人都知道他的意思,以及如何编码以正确停止服务?

-3

我在SvcStop()最后一行追加了我的代码。 “self.ReportServiceStatus(win32service.SERVICE_STOPPED)”

对我而言,它的作用是停止服务。

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask App" 

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

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     win32event.SetEvent(self.hWaitStop) 
     # !important! to report "SERVICE_STOPPED" 
     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 

    def SvcDoRun(self): 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
           servicemanager.PYS_SERVICE_STARTED, 
           (self._svc_name_,'')) 
     self.main() 

    def main(self): 
     app.run(host = '192.168.1.6') 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(AppServerSvc) 
相关问题