将 Python 脚本转换为可执行文件(.exe 文件)&把一个Python脚本注册为windows服务

  python实现自动切换壁纸(win10) - 陈致远大侠 - 博客园 (cnblogs.com)

  书接上文,我需要把该脚本注册为服务自动运行。实现流程like this:

  

c:\>python service.py install

c:\>python service.py start

c:\>python service.py stop

  但是捏,整完我发现咋都启动不了。我猜想服务是不是像计划任务一样,不支持直接运行python导致的?

  .py转成.exe 示例如下:

  

c:\>pip install pyinstaller

c:\>pyinstaller --onefile your_script.py

  接着,就会在your_script.py同级文件夹下看到build和dist两个文件夹

  

   在dist下会自动生成your_script.exe

   注册服务示例如下:

c:\>sc create YourService binPath= "C:\Path\to\your_script.exe" start= auto DisplayName= "Your Custom Service"

   做到这步依然无法正常运行该服务。查阅资料发现Windows服务得符合微软定义的编程规范(So Windows,fuck u),像是特定接口的实现、特殊操作的响应等。这里附上一个可注册为服务的python代码:

import os
import sys
import servicemanager
import win32event
import win32service
import win32serviceutil

# 这里替换为你的 Python 脚本的路径和名称
PYTHON_EXECUTABLE = r"C:\Python39\python.exe"
SCRIPT_PATH = r"C:\Path\to\your_script.py"

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)

    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):
        # 在这里添加你的 Python 脚本的执行逻辑
        # 例如调用你的脚本,传递参数等
        os.system(f"{PYTHON_EXECUTABLE} {SCRIPT_PATH}")

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

  

 

posted @ 2023-07-26 11:36  陈致远大侠  阅读(272)  评论(0编辑  收藏  举报