我已经检查了至少几十个类似的情况,但仍然没有找到解决方案,我希望有人可以解决一些问题,这里有一些我不知道的事情。
我正在使用Python3.6制作Windows服务,如果服务没有运行,该服务必须运行.exe文件。这是.py:
db2look
我已经安装了pywin32软件包,将它们添加到PATH中,因为它是在几个解决方案中建议的,并且还将.dll从pywin32_system32复制到win32
每次运行时,事件查看器都会打印此错误,无论是python service.py还是python service.py start,控制台也会打印出来:
ALTER SEQUENCE .. RESTART WITH ..
尝试从“服务”工具启动服务时,这是弹出的错误。我也看到了另一个错误,即服务没有及时响应的问题。
我尝试用pyinstaller和nuitka编译它,错误是一样的。我不确定如何继续,我已经改变了代码以适应我使用google和SO发现的示例和解决方案,并且对这些方法和原因一无所知。
如果有人以前遇到过这些问题,我真的很感激投入,到目前为止,其他答案对我没有帮助。
延迟编辑:修复代码缩进
答案 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)