有一些针对Windows的Python服务的问题

时间:2018-05-29 18:32:01

标签: python windows service pyinstaller pywin32

我已经检查了至少几十个类似的情况,但仍然没有找到解决方案,我希望有人可以解决一些问题,这里有一些我不知道的事情。

我正在使用Python3.6制作Windows服务,如果服务没有运行,该服务必须运行.exe文件。这是.py:

db2look

我已经安装了pywin32软件包,将它们添加到PATH中,因为它是在几个解决方案中建议的,并且还将.dll从pywin32_system32复制到win32

环境变量 Environment variables

事件查看器错误 Event Viewer Error

每次运行时,事件查看器都会打印此错误,无论是python service.py还是python service.py start,控制台也会打印出来:

ALTER SEQUENCE .. RESTART WITH ..

尝试从“服务”工具启动服务时,这是弹出的错误。我也看到了另一个错误,即服务没有及时响应的问题。

Services error when running

我尝试用pyinstaller和nuitka编译它,错误是一样的。我不确定如何继续,我已经改变了代码以适应我使用google和SO发现的示例和解决方案,并且对这些方法和原因一无所知。

如果有人以前遇到过这些问题,我真的很感激投入,到目前为止,其他答案对我没有帮助。

延迟编辑:修复代码缩进

1 个答案:

答案 0 :(得分:1)

这最终为我工作,除了代码的差异,我没有做任何特别的事情,经过几次尝试我用pyinstaller编译并运行service.exe install没有问题。人们可能不需要一些额外的日志记录行,但在调试和测试时它们派上了用场。

非常感谢所有发表评论的人,他们非常乐于助人,如果没有你,我们就无法做到这一点<3

import win32service, win32serviceutil, win32api, win32con, win32event, win32evtlogutil
import psutil
import subprocess
import os, sys, string, time, socket, signal
import servicemanager

class Service (win32serviceutil.ServiceFramework):
    _svc_name_ = "Service"
    _svc_display_name_ = "Service"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self, *args)
        self.log('Service Initialized.')
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)


    def log(self, msg):
        servicemanager.LogInfoMsg(str(msg))

    def sleep(self, sec):
        win32api.Sleep(sec*1000, True)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.stop()
        self.log('Service has stopped.')
        win32event.SetEvent(self.stop_event)
        self.ReportServiceStatus(win32service.SERVICE_STOPPED)

    def SvcDoRun(self):
        self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
        try:
            self.ReportServiceStatus(win32service.SERVICE_RUNNING)
            self.log('Service is starting.')
            self.main()
            win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
            servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_, ''))
        except Exception as e:
            s = str(e);
            self.log('Exception :'+s)
            self.SvcStop()

    def stop(self):
        self.runflag=False
        try:
            #logic
        except Exception as e:
            self.log(str(e))

    def main(self):
        self.runflag=True
        while self.runflag:
            rc = win32event.WaitForSingleObject(self.stop_event, 24*60*60)
            # Check to see if self.hWaitStop happened
            if rc == win32event.WAIT_OBJECT_0:
                self.log("Service has stopped")
                break
            else:
                try:
                    #logic
                except Exception as e:
                    self.log(str(e))

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