当前位置: 首页 > 面试题库 >

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

徐经武
2023-03-14
问题内容

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

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

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

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


问题答案:

可以。我使用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方法中设置的标志而中断



 类似资料:
  • 问题内容: 我想在CENTOS服务器中运行python脚本: 我正在使用它,并且工作正常…问题是:即使关闭ssh控制台后,如何保持此脚本运行? 问题答案: 我使用此代码来守护我的应用程序。它允许您使用以下命令来编写脚本。 除此之外,我还有一个init.d脚本来控制我的服务。这使您可以在操作系统启动时自动启动服务。 这是一个简单的示例,可以助您一臂之力。只需将代码移到一个类中,然后从内部的函数中调用

  • 问题内容: 我在Windows 7 32位操作系统中安装了postgreSQL二进制文件;我可以从cmd启动服务器,但 不能将其作为Windows服务运行。 这是我尝试手动启动服务时遇到的错误: 我要做的就是 双击我的Java应用程序启动到Windows后,我需要流畅地运行我的应用程序而没有任何数据库错误。我不能这样做,因为postgreSQL没有作为Windows服务运行。 我在Windows事

  • 问题内容: 是否可以在网络服务器上将Python脚本作为后台服务运行?我想这样做以进行套接字通信。 问题答案: 您可以使其成为守护程序。有一个PEP可以提供更完整的解决方案,但是我发现这样做很好。

  • 当我启动start WebLogic.cmd在mydomed\bin中时,我的服务器正常工作。当我注销时,它会自动停止。在这里,我试图创建一个窗口服务,如oracle文档“http://docs.oracle.com/cd/E11035_01/wls100/server_start/winservice.html”中所述。 但我的服务不再说这与此无关。 这是我创建的2个文件 1.)run.cmdD

  • 问题内容: 我一直在尝试编写从串行端口读取数据的python脚本。它在命令行上运行良好,但是我需要它作为后台进程运行而没有任何命令行界面。该脚本有一个while循环,该循环从串行端口读取下一个数据字节,并相应地模拟按键。为了使按键可以专注于当前窗口而不是python命令行,我需要脚本作为后台进程运行。我在这里读的答案很少,但是没有什么让我振奋。请指出正确的方向。 问题答案: 在Windows上,您

  • 问题内容: 我需要将PHP脚本设置为Windows服务。 无论哪个用户登录,我都需要它运行,以及在系统启动时都运行-所以听起来Windows服务是最好的,但是很高兴听到其他建议。 (此脚本连续运行,这不是我可以使用“计划任务管理器”执行的“每5分钟运行一次”。) 涵盖了使用sc.exe程序来安装服务。 但是,根据我的阅读,我需要对PHP脚本进行包装,以接受来自Windows服务管理器的特殊命令。有