Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
An example Windows service implemented with pywin32 wrappers. #python #windows-service #pywin32
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import time
import logging
logging.basicConfig(
filename = 'c:\\Temp\\hello-service.log',
level = logging.DEBUG,
format = '[helloworld-service] %(levelname)-7.7s %(message)s'
)
class HelloWorldSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "HelloWorld-Service"
_svc_display_name_ = "HelloWorld Service"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.stop_event = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
self.stop_requested = False
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.stop_event)
logging.info('Stopping service ...')
self.stop_requested = True
def SvcDoRun(self):
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,'')
)
self.main()
def main(self):
logging.info(' ** Hello PyWin32 World ** ')
# Simulate a main loop
for i in range(0,50):
if self.stop_requested:
logging.info('A stop signal was received: Breaking main loop ...')
break
time.sleep(5)
logging.info("Hello at %s" % time.ctime())
return
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(HelloWorldSvc)
@joselitosn

This comment has been minimized.

Copy link

@joselitosn joselitosn commented Mar 30, 2015

Just a note:
If you are pretending to use the service with PyInstaller to generate a single file, modify the file according to this post.

@Grosso-rob

This comment has been minimized.

Copy link

@Grosso-rob Grosso-rob commented Aug 20, 2016

if in the command prompt and were in the directory of this file,
and entering command
python helloworld-win32-service.py

this script will create the service just fine but when running i get a 1053 error "the service did not respond to the start or control request in a timely fashion"
i understand the thread you linked touches on it but could you update the example to help me figure it out? I have tried to run this script into a .EXE using pyinstaller, still no dice. thanks a bunch your code got me the farthest to understanding this process

@squareproton

This comment has been minimized.

Copy link

@squareproton squareproton commented Aug 30, 2016

I'm very curious as to what the purpose of the line 22 does in the __init__() method.

socket.setdefaulttimeout(60)

@starhopp3r

This comment has been minimized.

Copy link

@starhopp3r starhopp3r commented Feb 19, 2017

Does this service run every time the computer is booted? I mean does it autorun even before anyone logs in? Because I want to play music before signing in.

@4vadim4

This comment has been minimized.

Copy link

@4vadim4 4vadim4 commented Mar 10, 2017

hmmm..
python .py install
Installing service <name_service>
Service installed

BUT not started, I have a message: "The service has not been started. (1062)"
what wrong ?

@alex-eri

This comment has been minimized.

Copy link

@alex-eri alex-eri commented Mar 25, 2017

my service also not starting

@asand3r

This comment has been minimized.

Copy link

@asand3r asand3r commented Apr 25, 2017

my service also not starting

I've solved that problem by changing account that running the service.

@arwer13

This comment has been minimized.

Copy link

@arwer13 arwer13 commented Dec 18, 2017

One of the possible reasons might be inaccessibility of some DLLs.
For me it was pywintypes36.dll (and pythoncom36.dll).

@shekharkumud

This comment has been minimized.

Copy link

@shekharkumud shekharkumud commented Apr 1, 2018

faced the same issue solved it by finding out pywintypes36.dll pythoncom36.dll and placing it inside win32 with pythonservices.exe.

@TheCDC

This comment has been minimized.

Copy link

@TheCDC TheCDC commented Apr 14, 2018

For future googlers finding this snippet, I had a heck of a time figuring out how to avoid the dreaded 1053 error when trying to start the service (from an executable compiled with pyinstaller).

This snippet appears to be missing the part that actually invokes the main() of the service class when the Windows Service framework runs the executable.

This tutorial is more complete:
https://www.codeproject.com/Articles/1115336/Using-Python-to-Make-a-Windows-Service

The difference is going from this:

if __name__ == '__main__':
win32serviceutil.HandleCommandLine(HelloWorldSvc)

to this

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

This works because when the Service executes all it does is run the executable with no args. if len(sys.argv) == 1: checks how many command line args were supplied so it knows whether it's being run by the user with args such as install or otherwise being run as a service.

I hope this helps. Good luck!

@gurunadhd

This comment has been minimized.

Copy link

@gurunadhd gurunadhd commented Jul 28, 2018

I used command below to create the service successfullt.
sc create binpath= "C:\Python27\Python.exe " DisplayName= "" start= auto

@vlzx

This comment has been minimized.

Copy link

@vlzx vlzx commented Apr 30, 2020

The difference is going from this:

if __name__ == '__main__':
win32serviceutil.HandleCommandLine(HelloWorldSvc)

to this

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

This works because when the Service executes all it does is run the executable with no args. if len(sys.argv) == 1: checks how many command line args were supplied so it knows whether it's being run by the user with args such as install or otherwise being run as a service.

I hope this helps. Good luck!

Thanks! You saved my day.

@PradeepMaharana

This comment has been minimized.

Copy link

@PradeepMaharana PradeepMaharana commented Jun 17, 2021

I created windows service on python and it's running properly.But when when I am trying stop or abort service in between , it giving error 1053. What can be the solution to stop the running service

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment