How to create and run a python3 program as a windows service

Pass this to the next buddy!

Hi guys, today’s post is just for the ones of you that work with the “OS of the misoriented slashes 😂😂😂  ”: Microsoft Windows. 

Have you ever had the need of writing a Python script that could run in background as a Windows Service? In this post, you will learn how to do it in less than 10 minutes. Yes 10 min tops 😎 😎 .

I will skip all the introduction about Windows Services, how convenient they could be, how much could be appreciated the fact that they can be run in background even when the user is logged off etc… I mean, if you can code in Python and you use Windows I bet you already know what a Windows Service is, don’t you?

So, first of all, let’s start by installing the Python for Windows extensions:

 c:\test> pip install pywin32 

Once you have done it, let’s write this base class, your Windows service will be a subclass of this base class.

@author:- J.O. Iddriss

Base class to create winservice in Python

Just create a new class that inherits from this base class
Define into the new class the variables
svc_name = “nameOfWinservice”
svc_display_name = “name of the Winservice that will be displayed in scm”
svc_description = “description of the Winservice that will be displayed in scm”
Override the three main methods:
def start(self) : if you need to do something at the service initialization.
A good idea is to put here the inizialization of the running condition
def stop(self) : if you need to do something just before the service is stopped.
A good idea is to put here the invalidation of the running condition
def main(self) : your actual run loop. Just create a loop based on your running condition
Define the entry point of your module calling the method “parse_command_line” of the new class
import socket

import win32serviceutil

import servicemanager
import win32event
import win32service

class SMWinservice(win32serviceutil.ServiceFramework):
”’Base class to create winservice in Python”’

_svc_name_ = 'pythonService'
_svc_display_name_ = 'Python Service'
_svc_description_ = 'Python Service Description'

def parse_command_line(cls):
    ClassMethod to parse the command line

def __init__(self, args):
    Constructor of the winservice
    win32serviceutil.ServiceFramework.__init__(self, args)
    self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

def SvcStop(self):
    Called when the service is asked to stop

def SvcDoRun(self):
    Called when the service is asked to start
                          (self._svc_name_, ''))

def start(self):
    Override to add logic before the start
    eg. running condition

def stop(self):
    Override to add logic before the stop
    eg. invalidating running condition

def main(self):
    Main class to be ovverridden to add logic
"""entry point of the module: copy and paste into the new module"""
if name == 'main':

Let’s examine the class we have just introduced a little.

def SvcDoRun(self): it’s the method that will be called when the service is requested to start.

def SvcStop(self): it’s the method that will be called when the service is requested to stop.

def start(self): it’s a method that you will be asked to override if you need to do something when the service is starting (before started)

def stop(self): it’s the method that you will be asked to override if you need to do something when the service is stopping (before stopped)

def main(self): it’s the method that will contain the logic of your script, usually in a loop that keeps it alive until the service is stopped.

def parse_command_line(cls): it’s the method that handles the command line interface that you can use to install and update your windows service

Can you see how easy it is with pywin32 to interface with the system to create a Windows Service? The last mention is for the following variables:

svc_name = "PythonCornerExample"
svc_display_name = "Python Corner’s Winservice Example"
svc_description = "That’s a great winservice! :)"

These are just three variables that contain the name of the service, the “friendly name” that will be used by Windows to display the name on the mmc console and a short description of your service.

As always, enough talk, let’s code something useful!

Let’s pretend that we want to create a Winservice that, when started, creates a random file on our C: drive every 5 seconds.

What? Do you think it is stupid? Well, install it on your boss PC, set the destination folder as its user’s desktop and you will change your mind. 

However, how can you achieve this result? Super easy.

  1. Subclass the SMWinservice class we have just met.
  2. On the new class, override the three variables _svc_name__svc_display_name_ and _svc_description_.
  3. Override the “start” method to set the running condition. Setting a boolean variable will be enough for that.
  4. Override the “stop” method to invalidate the running condition when the service is requested to be stopped.
  5. Override the “main” method to add the logic of creating a random file every 5 seconds
  6. Add the call at the “parse_command_line” function to handle the command line interface.

The result should be something like this:

import time
import random
from pathlib import Path
from SMWinservice import SMWinservice

class PythonCornerExample(SMWinservice):
     svc_name = "PythonCornerExample"
     svc_display_name = "Python Corner's Winservice Example"
     svc_description = "That's a great winservice! :)"

def start(self):
    self.isrunning = True

def stop(self):
    self.isrunning = False

def main(self):
    i = 0
    while self.isrunning:
        x = random.randint(1, 1000000)
if name == 'main':

That’s it! Now it’s time to install our newly created winservice. Just open a command prompt, navigate to your script directory and install the service with the command:

C:\test> python install
Installing service PythonCornerExample
Service installed

In the future, if you want to change the code of your service, just modify it and reinstall the service with

C:\test> python update
Changing service configuration
Service updated

Now, open the “Services” msc snap in

C:\test> mmc Services.msc

locate your new PythonCornerExample winservice, and right click and choose properties. Here you can start your service and configure it at your will.

Now try to start your service and go to see your C: folder contents.

Can you see all these files being created to your C: folder? Yeah, that’s working!

But now it’s time to stop it!  You can do it from the previous windows or just by using the command line

C:\test> net stop PythonCornerExample

Troubleshooting 👨🏿‍💻 👨🏿‍💻 👨🏿‍💻 👨🏿‍💻

There are a couple of known problems that can happen writing Windows Services in Python. If you have successfully installed the service but starting it you get an error, follow this iter to troubleshoot your service:

  1. Check if Python is in your PATH variable. It MUST be there. To check this, just open a command prompt and try starting the python interpreter by typing “python”. If it starts, you are ok.
  2. Be sure to have the file C:\Program Files\Python37\Lib\site-packages\win32\pywintypes37.dll (where “37” is the version of your Python installation). If you don’t have this file, take it from C:\Program Files\Python37\Lib\site-packages\pywin32_system32\pywintypes37.dll and copy it into C:\Program Files\Python37\Lib\site-packages\win32

That is it you guy my guy. Learn well 😁 😁 😁

Pass this to the next buddy!

Howto-daily Team

Howto-daily team is a group of volunteering writers who are working very hard to achieve the free-knowledge access goals. Ack:- J. Jay, I.O. Iddris, I.J.Kinley, I.I. Kim. Email letmehelp AT howto-daily dot com.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.