开发者社区> 问答> 正文

如何在Windows中将Python脚本作为服务运行?

我正在草拟一组程序的体系结构,这些程序共享存储在数据库中的各种相互关联的对象。我希望其中一个程序充当服务,为这些对象的操作提供更高级别的接口,而其他程序则通过该服务访问对象。

我目前的目标是将Python和Django框架作为实现该服务的技术。我很确定自己知道如何守护Linux中的Python程序。但是,这是系统应支持Windows的可选规格。我几乎没有Windows编程经验,也没有Windows服务经验。

是否可以将Python程序作为Windows服务运行(即在没有用户登录的情况下自动运行它)?我不必一定要实现这一部分,但是我需要一个大概的想法,即如何决定是否按照这些原则进行设计。

编辑:感谢到目前为止的所有答案,它们是相当全面的。我想知道一件事:Windows如何了解我的服务?我可以使用本地Windows实用程序对其进行管理吗? 将启动/停止脚本放入/etc/init.d相当于什么?

展开
收起
祖安文状元 2020-02-22 18:18:47 1126 0
1 条回答
写回答
取消 提交回答
  • 是的你可以。我使用ActivePython随附的pythoncom库或可以与pywin32(适用于Windows的Python扩展)一起安装的方式来执行此操作。

    这是简单服务的基本框架:

    import win32serviceutil
    import win32service
    import win32event
    import servicemanager
    import socket
    
    
    class AppServerSvc (win32serviceutil.ServiceFramework):
        _svc_name_ = "TestService"
        _svc_display_name_ = "Test Service"
    
        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):
            pass
    
    if __name__ == '__main__':
        win32serviceutil.HandleCommandLine(AppServerSvc)
    
    

    您的代码将进入main()方法中-通常带有某种无限循环,可能会通过检查在SvcStop方法中设置的标志而中断

    2020-02-22 18:18:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载