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

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

在本文中,我们将介绍如何在Windows操作系统中将Python脚本作为服务运行。通过将Python脚本作为服务运行,我们可以在后台持续地执行脚本,而无需用户登录或手动运行。

阅读更多:Python 教程

什么是Windows服务?

Windows服务是在后台运行的应用程序或程序代码,通常无需用户干预即可在操作系统启动时启动。服务可以在Windows操作系统中自动启动、停止和重启,而无需用户的参与。将Python脚本作为服务运行,可以让我们的脚本在后台持续地执行,并且可以设置为自动启动。

1. 使用pywin32库

pywin32是一个Python扩展模块,提供了访问Windows API的功能。我们可以使用pywin32库来创建和管理Windows服务。首先,确保已经安装了pywin32库,可以使用以下命令来安装:

pip install pywin32
Python

接下来,我们可以使用下面的示例代码来创建一个简单的Python服务。

import servicemanager
import socket
import sys
import win32event
import win32service
import win32serviceutil

class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'MyPythonService'
    _svc_display_name_ = 'My Python Service'

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.is_running = True

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.is_running = False

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        self.main()

    def main(self):
        # 在这里写入你的代码和逻辑
        while self.is_running:
            pass

if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(MyService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(MyService)
Python

在上面的示例中,我们创建了一个名为MyService的服务类,继承自win32serviceutil.ServiceFramework。我们需要根据自己的需求修改_svc_name__svc_display_name_为自己的服务名称。在main方法中,可以编写自己的代码和逻辑,服务会一直运行直到调用SvcStop方法停止。

使用命令提示符(以管理员身份运行)执行以下命令,来安装和启动服务:

python path/to/your_python_script.py install
python path/to/your_python_script.py start
Python

要停止和卸载服务,可以使用以下命令:

python path/to/your_python_script.py stop
python path/to/your_python_script.py remove
Python

2. 使用pywin32安装器

pywin32安装器提供了一个简化的方式来将Python脚本转换为Windows服务。在安装pywin32时,可以选择安装“pywin32 service”选项。安装后,我们可以使用以下示例代码来创建一个简单的Python服务。

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import sys

class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'MyPythonService'
    _svc_display_name_ = 'My Python Service'

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.is_running = True

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.is_running = False

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        self.main()

    def main(self):
        # 在这里写入你的代码和逻辑
        while self.is_running:
            pass

if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(MyService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(MyService)
Python

在上面的示例中,我们同样创建了一个名为MyService的服务类。同样需要根据自己的需求修改_svc_name__svc_display_name_为自己的服务名称。在main方法中,可以编写自己的代码和逻辑。

使用命令提示符(以管理员身份运行)执行以下命令,来安装和启动服务:

python -m win32traceutil -install
python path/to/your_python_script.py --startup auto install
python path/to/your_python_script.py start
Python

要停止和卸载服务,可以使用以下命令:

python path/to/your_python_script.py stop
python path/to/your_python_script.py remove
Python

总结

本文介绍了在Windows操作系统中将Python脚本作为服务运行的两种方法:使用pywin32库和使用pywin32安装器。通过将Python脚本作为服务运行,我们可以在后台持续地执行脚本,而无需用户登录或手动运行。选择适合自己需求的方法,并根据示例代码进行相应的配置和编写代码和逻辑,即可实现Python脚本的服务化运行。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册