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

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

我目前将Python和Django框架作为实现该服务的技术。 我非常肯定,我知道如何在Linux中对Python程序进行守护进程。 但是,这是系统应支持Windows的可选规范项目。 我几乎没有使用Windows编程的经验,也没有使用Windows服务的经验。

是否有可能将Python程序作为Windows服务运行(即,在没有用户登录的情况下自动运行它)? 我不一定要实现这一部分,但我需要一个粗略的想法来确定是否要按照这些方式进行设计。

编辑:感谢迄今为止的所有答案,它们非常全面。 我还想知道一件事:Windows如何意识到我的服务? 我可以使用本地Windows实用程序来管理它吗? 在/etc/init.d中放入启动/停止脚本等同于什么?


是的你可以。 我使用的是包含在ActivePython中的pythoncom库,或者可以使用pywin32(Python for Windows extensions)来安装它。

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

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方法中设置


虽然我在几周前回复了所选的答案,但与此同时我在这个主题上挣扎了很多。 感觉就像有一个特殊的Python安装,并使用特殊的模块来运行脚本作为服务,只是错误的方式。 可移植性等呢?

我偶然发现了非常吸引人的服务管理器,这使得它处理Windows服务变得非常简单和理智。 我想,因为我可以将选项传递给已安装的服务,所以我可以选择我的Python可执行文件并将我的脚本作为选项传递。

我还没有尝试过这个解决方案,但我现在要做,并在整个过程中更新这篇文章。 我也对在Windows上使用virtualenvs感兴趣,所以我可能迟早会拿出一个教程并链接到它。


几乎所有的Windows可执行文件都可以作为服务安装。

方法1:使用rktools.exe中的instsrv和srvany

对于Windows Home Server或Windows Server 2003(也适用于WinXP),Windows Server 2003资源工具包工具随附可用于此目的的实用程序,称为instsrv.exesrvany.exe 。 有关如何使用这些使用情况的详细信息,请参阅此Microsoft知识库文章KB137890。

对于Windows Home Server,适用于名为aptly“Any Service Installer”的这些实用程序的用户友好包装器。

方法2:为Windows NT使用ServiceInstaller

有另一种替代方法可以使用ServiceInstaller for Windows NT(可在此下载),并提供python指令。 与名称相反,它同时适用于Windows 2000和Windows XP。 以下是关于如何将python脚本安装为服务的说明。

安装Python脚本

运行ServiceInstaller以创建新服务。 (在这个例子中,假设python安装在c: python25)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:python25python.exe
Arguments : c:path_to_your_python_scripttest.py
Working Directory : c:path_to_your_python_script

安装后,打开控制面板的服务小程序,选择并启动PythonTest服务。

在我最初的回答后,我注意到在SO上已经发布了密切相关的问答。 也可以看看:

我可以将Python脚本作为服务运行吗(在Windows中)? 怎么样?

如何让Windows意识到我用Python编写的服务?

链接地址: http://www.djcxy.com/p/18465.html

上一篇: How do you run a Python script as a service in Windows?

下一篇: Add nginx.exe as Windows system service (like Apache)?