Skip to content

Instantly share code, notes, and snippets.

@drmalex07
Created April 12, 2014 20:08
Show Gist options
  • Save drmalex07/10554232 to your computer and use it in GitHub Desktop.
Save drmalex07/10554232 to your computer and use it in GitHub Desktop.
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)
@simbullar
Copy link

For anyone else encountering a 1053 error with pyinstaller, it is also worth checking for other errors not necessarily related to the answer above.

In my case, turns out my program has relative paths for config files, etc.

Windows Services set C:\Windows\system32 as the working directory for the application.

This answer for Determining application path in a Python EXE generated by pyInstaller along with a os.chdir to change working directory worked for me:

# NOTE: for a --onefile executable, the path to the application is given by application_path = os.path.dirname(sys.executable) –
application_path = os.path.dirname(sys.executable)

# print(os.getcwd())  # will be C:\Windows\System32 when run as a service
# print('application_path ' + str(application_path))

# Change working directory to application path
os.chdir(application_path)

why changig dir if you can os.path.join? that would be a little be faster for optimization

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