Hello people, if you need to run a script as service on Windows.
And this script called servicedeploy.py:
import win32serviceutil import win32service import win32event import servicemanager import socket import time import logging import subprocess pathexe = r"C:/dist/serviceweb.exe" 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_ = "SERVICE WEB" _svc_display_name_ = "NAME 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,1): if self.stop_requested: logging.info('A stop signal was received: Breaking main loop ...') break time.sleep(5) subprocess.Popen([pathexe]) logging.info("Hello at %s" % time.ctime()) return if __name__ == '__main__': win32serviceutil.HandleCommandLine(HelloWorldSvc)
https://www.pyinstaller.org/ PyInstaller is a program that freezes (packages) Python programs into stand-alone executables, under Windows, Linux, Mac OS X, FreeBSD, Solaris and AIX.
Win32 (pywin32) extensions, which provides access to many of the Windows APIs from Python.
I do this script called serviceweb.py in flask to convert into service:
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "hello world from service" if __name__ == "__main__": app.run(debug=false,host="0.0.0.0", port=900)
Now I need to compile this script (excecutable.exe)
how I do this? I can do it with pyinstaller: Open the CMD and go to the directory where are your script and used this commands:
--onefile: the script compile on one file.
--windowed: the script doesn't run windowed ( the services of windows run without graphic resource)
pyinstaller --onefile --windowed yourscript.py
My script is on "c:\"
When the pyinstaller finishes correctly, it generates a directory called dist where are your executable with script name.
Now you have a service! and you can executed manuallity.
The next step
Deploy service with pywin32 using servicedeploy.py firt:
1.Edit servicedeployd with favorite editor.
2.Change pathexe with the path of your service.
3.Save the changes
And then, install the service.
Again open your CMD and go to the directory where are servicedeploy.py and do the follow:
python servicedeploy.py install
you have to start the manual service the first time, you could change it to automatic from the service manager.
I am sorry for my bad english. I hope you understand me.