当前位置:优草派 > 问答 > Python问答

以windows service方式运行Python程序的方法

标签: Python  Python应用  Windows Service  作者: hsq357

回答:

在Windows操作系统中,运行Python程序的方式有很多种,比如通过命令行方式、通过IDE工具等等。但是有些情况下,我们需要将Python程序作为Windows Service来运行,这样可以实现程序的自启动、定时运行、后台运行等功能,提高程序的稳定性和可靠性。本文将从多个角度介绍如何以Windows Service方式运行Python程序。

一、Windows Service介绍

Windows Service是一种在Windows操作系统后台运行的程序,它可以在Windows启动时自动启动,并在后台长时间运行,不需要用户干预。Windows Service可以通过Windows Service控制器来管理,可以启动、停止、暂停、恢复等操作。Windows Service通常用于实现系统服务、网络服务等。

二、Python程序转化为Windows Service

将Python程序转化为Windows Service有多种方法,下面介绍其中两种常用的方法。

1.使用win32serviceutil库

win32serviceutil库是Python中用于实现Windows Service的库,它提供了一些方便的方法来实现Windows Service。使用该库创建Windows Service主要包括以下步骤:

(1)编写Python程序

首先需要编写Python程序,该程序需要有一个主函数,用于实现Windows Service的主要功能。例如:

```

import time

import threading

def main():

while True:

print('Hello, world!')

time.sleep(1)

if __name__ == '__main__':

main()

```

该程序的主要功能是每秒钟打印一次“Hello, world!”。

(2)创建Windows Service

使用win32serviceutil库创建Windows Service需要在cmd命令行中执行如下命令:

```

python win32serviceutil.py --startup auto install \

--service-name "MyService" --display-name "My Service" \

--description "This is my service" \

python.exe E:\Python\myservice.py

```

其中,--startup参数指定Windows Service的启动类型,auto表示自动启动;--service-name参数指定Windows Service的名称;--display-name参数指定Windows Service的显示名称;--description参数指定Windows Service的描述信息;最后一个参数是Python程序的路径。

执行上述命令后,Windows Service就会被创建并注册到Windows Service控制器中。

(3)启动Windows Service

使用如下命令启动Windows Service:

```

net start MyService

```

其中,MyService是Windows Service的名称。

(4)停止Windows Service

使用如下命令停止Windows Service:

```

net stop MyService

```

(5)卸载Windows Service

使用如下命令卸载Windows Service:

```

python win32serviceutil.py remove MyService

```

其中,MyService是Windows Service的名称。

2.使用NSSM工具

NSSM(Non-Sucking Service Manager)是一款开源的Windows Service管理工具,它可以将任何可执行文件转化为Windows Service。使用NSSM创建Windows Service主要包括以下步骤:

(1)下载并安装NSSM工具

在https://nssm.cc/download下载NSSM工具,解压后将nssm.exe文件复制到Python程序所在的目录下。

(2)创建Windows Service

使用如下命令创建Windows Service:

```

nssm install MyService E:\Python\python.exe E:\Python\myservice.py

```

其中,MyService是Windows Service的名称,E:\Python\python.exe是Python解释器的路径,E:\Python\myservice.py是Python程序的路径。

执行上述命令后,NSSM会弹出一个对话框,可以设置Windows Service的名称、描述、启动类型等信息。

(3)启动Windows Service

使用如下命令启动Windows Service:

```

net start MyService

```

其中,MyService是Windows Service的名称。

(4)停止Windows Service

使用如下命令停止Windows Service:

```

net stop MyService

```

(5)卸载Windows Service

使用如下命令卸载Windows Service:

```

nssm remove MyService

```

其中,MyService是Windows Service的名称。

三、Python程序实现Windows Service功能

将Python程序转化为Windows Service后,需要实现Windows Service的功能。Python程序需要实现以下两个函数:

1.服务入口函数

服务入口函数用于启动和停止Windows Service,它可以通过win32serviceutil库中的StartServiceCtrlDispatcher方法来实现。代码如下:

```

import win32serviceutil

import win32service

import win32event

import servicemanager

class MyService(win32serviceutil.ServiceFramework):

_svc_name_ = 'MyService'

_svc_display_name_ = 'My Service'

_svc_description_ = 'This is my service'

def __init__(self, args):

win32serviceutil.ServiceFramework.__init__(self, args)

self.stop_event = win32event.CreateEvent(None, 0, 0, None)

def SvcStop(self):

self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)

win32event.SetEvent(self.stop_event)

def SvcDoRun(self):

servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,

servicemanager.PYS_SERVICE_STARTED,

(self._svc_name_, ''))

self.main()

def main(self):

while True:

print('Hello, world!')

time.sleep(1)

if __name__ == '__main__':

win32serviceutil.HandleCommandLine(MyService)

```

在该代码中,MyService类继承自win32serviceutil.ServiceFramework类,重载了SvcStop和SvcDoRun方法。SvcStop方法用于停止Windows Service,SvcDoRun方法用于启动Windows Service。在SvcDoRun方法中,可以调用自定义的main方法来实现Windows Service的功能,例如在本例中每秒钟打印一次“Hello, world!”。

2.主函数

主函数用于解析命令行参数,创建Windows Service实例并启动Windows Service。代码如下:

```

if __name__ == '__main__':

win32serviceutil.HandleCommandLine(MyService)

```

在该代码中,调用win32serviceutil.HandleCommandLine方法来解析命令行参数,并创建MyService实例并启动Windows Service。

四、总结

本文介绍了将Python程序转化为Windows Service的方法,包括使用win32serviceutil库和NSSM工具两种方法。同时还介绍了Python程序实现Windows Service功能的方法,包括实现服务入口函数和主函数。通过将Python程序转化为Windows Service,可以实现程序的自启动、定时运行、后台运行等功能,提高程序的稳定性和可靠性。

TOP 10
  • 周排行
  • 月排行