我根据此代码Is it possible to run a Python script as a service in Windows? If possible, how?创建了一项服务 问题是我无法顺利停止服务 要停止服务,我需要每隔一段时间重新检查停止事件的标志 有没有更好的方法来停止python中的服务? 这就是我目前试图停止服务的方式。
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_,''))
myStatusThread = threading.Thread(target=win32event.WaitForSingleObject, args=(self.hWaitStop, win32event.INFINITE))
myStatusThread.start()
while True:
if not myStatusThread.isAlive():
sys.exit(0)
else:
doStuff()#do something that takes some time
所以服务只在“doStuff”完成后停止,这可能需要很长时间 我想在用户在服务中停止服务后立即停止服务。
答案 0 :(得分:0)
事实上,你的问题是双重问题:如何测试一个事件,我怎样才能顺利停止长时间运行?不幸的是,第二部分没有简单直接的答案。常见的用法是手动识别代码中的停止点,并在其中放置一个简单的例程来测试事件并引发自定义异常。这允许一个地方在退出之前进行一些清理。
您的代码可能会变得(或多或少):
obj.setData = function(){
// call this function from directive 1.
}
return obj;
})`
以后......
class EventException(Exception):
def __init__(status):
# allows to know where you exit from in case cleanup depends on it
self.status = status
那样:
答案 1 :(得分:-1)
在winapi中使用NSSM insead编码此任务可能更好:
nssm install my_python_service
nssm set my_python_service Application C:\Python3\python.exe
nssm set my_python_service AppDirectory C:\myscript\
nssm set my_python_sevice AppParameters C:\myscrip\myscript_main_file.py
nssm set my_python_sevice Start SERVICE_AUTO_START
nssm run my_python_service
停止服务:
nssm stop my_python_service