python未启动调试程序_Python 3 Windows Service仅在调试模式下启动

I first posted an answer in this post, but it didn't conform to the forum standards. I hope this time te answer fits the forum standards. This code should be more clear and easy to read.

In Python 3+ I have the following class that I use to build a Windows Service (it does nothing, just writes a log file):

#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)

In the script I use a log file to check if it's working properly. I'm running python3.6 (also tried with python3.4) on Windows 7 and I'm experiencing the following problem. When I run python MyWindowsService.py install the prompt says that the service has been installed (but nothing is written in the log file). If I try to start the service, I get Service Error: 1 - More info NET HELPMSG 3547 which doesn't say much about the error. If I run python MyWindowsService.py debug, the program runs just fine (the log file is written), but still I don't have any control over the service: if I open another prompt and try to stop/start the service I still got the same results as stated above.

I also tryed to insert some debug code inside the init function, and when I run python MyWindowsService.py install it seems it doesn't get called. Is it possible?

I've checked for multiple solution and workarounds around the net, but I didn't find anything suitable. What am I missing?

解决方案

As pointed out by eriksun in the comment to the first post, the problem came from the location of the python script, that was in a drive mapped with an UNC path - I'm working with a virtual machine. Moving the python script in the same drive as the python installation did the job.

To sum it up for future uses, if the service fails to start and you're pretty sure about your code, these are helpful actions to try and solve your issues:

use sc start ServiceName, sc query ServiceName and sc stop ServiceName to get info about the service.

check if your file is in a physical drive or in a UNC-mapped drive. If the latter try to run the script using the UNC path (for example python \\Server\share\python\your-folder\script.py) or move your script in the same drive as the python installation

make sure that "python36.dll", "vcruntime140.dll", and "pywintypes36.dll" are either symlink'd to the directory that has PythonService.exe; or symlink'd to the System32 directory; or that the directories with these DLLs are in the system (not user) Path

Check the system register with command reg query HKLM\System\CurrentControlSet\Services\your_service_name /s to get more information about the script

PLease, feel free to complete, change, modify the last so that it can be usefull for anyone that like me encounder this issue.

EDIT: One more thing... My project was thought to work actually with network folders (and UNC-mapped drive) and it failed when I tried to make it run as service. One very useful (day-saving) resource that I used to make it work is the SysinternalsSuite by Mark Russinovich that I found in this post. Hope this helps.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值