Python 3 Windows服务仅在debugging模式下启动

我在这个post里贴了一个答案,但是不符合论坛的标准。 我希望这次的答案符合论坛标准。 这个代码应该更清晰,易于阅读。

在Python 3+中,我使用以下类来构buildWindows Service(它什么也不做,只是写一个日志文件):

#MyWindowsService.py import win32serviceutil import servicemanager import win32service import win32event import sys import logging import win32api class MyWindowsService(win32serviceutil.ServiceFramework): _svc_name_ = 'ServiceName' _svc_display_name_ = 'Service Display Name' _svc_description_ = 'Service Full Description' logging.basicConfig( filename = 'c:\\Temp\\{}.log'.format(_svc_name_), level = logging.DEBUG, format = '%(levelname)-7.7s @ %(asctime)s: %(message)s' ) def __init__(self, *args): self.log('Initializing service {}'.format(self._svc_name_)) win32serviceutil.ServiceFramework.__init__(self, *args) self.stop_event = win32event.CreateEvent(None, 0, 0, None) def SvcDoRun(self): self.ReportServiceStatus(win32service.SERVICE_START_PENDING) try: self.log('START: Service start') self.ReportServiceStatus(win32service.SERVICE_RUNNING) self.start() win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE) except Exception as e: self.log('Exception: {}'.format(e)) self.SvcStop() def SvcStop(self): self.log('STOP: Service stopping...') self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.stop() win32event.SetEvent(self.stop_event) self.ReportServiceStatus(win32service.SERVICE_STOPPED) def log(self, msg): servicemanager.LogInfoMsg(str(msg)) #system log logging.info(str(msg)) #text log def start(self): self.runflag = True while self.runflag: win32api.Sleep((2*1000), True) self.log('Service alive') def stop(self): self.runflag = False self.log('Stop received') if __name__ == '__main__': win32serviceutil.HandleCommandLine(MyWindowsService) 

在脚本中,我使用一个日志文件来检查它是否正常工作。 我在Windows 7上运行python3.6(也试过用python3.4),我遇到了以下问题。 当我运行python MyWindowsService.py install提示说服务已经安装(但没有写入日志文件)。 如果我尝试启动该服务,则会收到服务错误:1 – 更多信息NET HELPMSG 3547对错误没有太多说明。 如果我运行python MyWindowsService.py debug ,程序运行得很好(日志文件被写入),但是我仍然无法控制服务:如果我打开另一个提示并尝试停止/启动服务,我仍然得到了与上述相同的结果。

我也尝试在init函数中插入一些debugging代码,当我运行python MyWindowsService.py安装它似乎没有被调用。 可能吗?

我已经检查了networking上的多个解决scheme和解决方法,但我没有find任何合适的。 我错过了什么?

Solutions Collecting From Web of "Python 3 Windows服务仅在debugging模式下启动"

正如eriksun在第一篇文章的评论中指出的那样,问题来自python脚本的位置,这是在映射有UNC路径的驱动器中 – 我正在使用虚拟机。 将python脚本移到与python安装相同的驱动器中,完成了这项工作。 总结起来以备将来的使用,如果服务无法启动,而且对代码非常确定,这些措施可以帮助您解决问题:

  • 使用sc start ServiceNamesc query ServiceNamesc stop ServiceName以获取有关该服务的信息。
  • 检查您的文件是否在物理驱动器或UNC映射的驱动器中。 如果后者尝试使用UNC路径(例如python \\server\share\python\your-folder\script.py )来运行脚本,或者将脚本移到与python安装相同的驱动器中
  • 请确保“python36.dll”,“vcruntime140.dll”和“pywintypes36.dll”符号链接到具有PythonService.exe的目录; 或符号链接到System32目录; 或者与这些DLL的目录是在系统(不是用户)路径
  • 使用命令reg query HKLM\System\CurrentControlSet\Services\your_service_name /s检查系统寄存器以获取有关脚本的更多信息

PLease,随时完成,更改,修改最后,这样可以是任何人喜欢我遇到这个问题是有用的。

编辑:还有一件事…我的项目被认为实际上与网络文件夹(和UNC映射的驱动器)工作,它失败时,我试图使其作为服务运行。 一个非常有用(节省时间)的资源,我用它来工作是由Mark Russinovich SysinternalsSuite ,我在这篇文章中找到。 希望这可以帮助。