对于Python制作Windows系统服务的完整攻略,可以按照以下步骤进行:
1. 安装pywin32模块
在制作Windows系统服务之前,需要先安装pywin32模块,它是Python在Windows操作系统下的一个扩展库,可以实现操作Windows系统的一些功能,包括服务的创建和管理。
可以使用pip安装pywin32模块,命令如下:
pip install pywin32
2. 创建服务程序
在Python中创建服务程序的步骤如下:
- 导入win32serviceutil、win32service、win32event、win32api等模块。
- 创建一个服务类,必须继承win32serviceutil.ServiceFramework类,并实现其中的几个方法,包括
__init__
、SvcDoRun
、SvcStop
等。 - 使用
win32api.SetConsoleCtrlHandler()
方法设置Console的Control Handler,这样可以在控制台中方便地停止服务。 - 使用
win32serviceutil.HandleCommandLine()
方法注册服务,这会在Windows系统中创建服务。
示例代码如下:
import win32serviceutil
import win32service
import win32event
import win32api
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = "MyService"
_svc_display_name_ = "My Service"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
win32api.SetConsoleCtrlHandler(lambda x: self.SvcStop(), True)
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
while(True):
if win32event.WaitForSingleObject(self.hWaitStop, 1000) == win32event.WAIT_OBJECT_0:
break
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MyService)
上述示例中创建了一个名为"MyService",显示名称为"My Service"的服务类,实现了__init__
、SvcDoRun
、SvcStop
等方法。
3. 注册服务
成功创建服务程序后,需要将其注册到Windows系统中。
使用以下命令,将服务注册到系统中:
python MyService.py install
这个命令应该在管理员权限下执行。
4. 启动和停止服务
注册服务之后,可以使用以下命令启动服务:
net start MyService
停止服务则可以使用以下命令:
net stop MyService
示例说明
示例1:创建一个简单的服务
下面演示一下如何创建一个简单的服务,并启动它。
在代码编辑器中创建一个名为"MyService"的.py文件,输入以下代码:
import win32serviceutil
import win32service
import win32event
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = "MyService"
_svc_display_name_ = "My Service"
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MyService)
然后打开管理员权限的命令行,切换到文件所在目录下,执行以下命令,将服务程序注册到系统中:
python MyService.py install
接下来,启动服务:
net start MyService
这时服务便已经启动了,可以在服务管理器中看到它的状态。
停止服务时,可以使用以下命令:
net stop MyService
示例2:使用服务进行定时执行
在这个示例中,我们将演示如何使用服务进行定时执行操作。
在代码编辑器中创建一个名为"MyService2"的.py文件,输入以下代码:
import win32serviceutil
import win32service
import win32event
import time
class MyService2(win32serviceutil.ServiceFramework):
_svc_name_ = "MyService2"
_svc_display_name_ = "My Service 2"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
self.interval = 60 # 60 seconds
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
while True:
self.do_something()
if win32event.WaitForSingleObject(self.hWaitStop, self.interval * 1000) == win32event.WAIT_OBJECT_0:
break
def do_something(self):
print("do something...")
# do your jobs here
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MyService2)
这个示例中,我们定义了一个名为"MyService2",显示名称为"My Service 2"的服务类,实现了定时执行的do_something方法,并将服务执行的时间间隔设置为60秒。
接着,注册服务:
python MyService2.py install
这时,服务已经被注册到系统中,可以使用以下命令启动服务:
net start MyService2
等待60秒后,可以在服务记录中看到打印的"do something..."日志,这说明定时任务已经被成功执行。当服务不再需要时,可以使用以下命令停止服务:
net stop MyService2
以上就是Python制作Windows系统服务的完整攻略和两个示例说明,需要注意的是,在操作系统中进行服务的创建和启动时需要管理员权限,在代码中调用一些系统级API时,也可能需要获取管理员权限,才能够正常执行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python制作Windows系统服务 - Python技术站