Barra laterale

programmazione:python:script_come_servizio_su_win32

Avviare uno script Python come servizio di sistema di Windows

Autore: Fabio Di Matteo
Ultima revisione: 18/12/2018 - 10:09

Il nostro script di esempio lancia un banale webserver all'indirizzo http://localhost:8081 .

Primo metodo- creare un eseguibile che lancia Python con il nostro script

httpd.py

#!/usr/bin/env python3
 
from http.server import BaseHTTPRequestHandler, HTTPServer
 
# HTTPRequestHandler class
class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
 
  # GET
  def do_GET(self):
        # Send response status code
        self.send_response(200)
 
        # Send headers
        self.send_header('Content-type','text/html')
        self.end_headers()
 
        # Send message back to client
        message = "Hello world from python service!"
        # Write content as utf-8 data
        self.wfile.write(bytes(message, "utf8"))
        return
 
def run():
  print('starting server...')
 
  # Server settings
  # Choose port 8080, for port 80, which is normally used for a http server, you need root access
  server_address = ('127.0.0.1', 8081)
  httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
  print('running server...')
  httpd.serve_forever()
 
 
run()

Lo script deve essere lanciato da un eseguibile nativo, altrimenti non funziona (Testato su Windows7). Dunque creiamo il nostro lanciatore :

#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char** argv)
{
	system("C:\\msys64\\mingw64\\bin\\python3.exe  c:\\httpd.py");
	return 0;
}

Compiliamo il nostro lanciatore . Io uso msys2 su Windows:

gcc myservice.c -o PythonApp.exe 

Posizioniamo per comodita' i due file (httpd.py e PythonApp.exe) in C:\

Fatto cio' non ci resta altro che avviare un terminale di windows (cmd.exe) come amministratore e impartire il seguente comando:

sc create PythonApp binPath= "C:\PythonApp.exe" displayname= "Python http example" depend= tcpip start= auto

Se volessimo eliminare il servizio:

sc delete PythonApp 

E' necessario riavviare il sistema per far partire il servizio.

Secondo metodo- usando il programma libero nssm

Scarichiamo nssm, un piccolo eseguibile che non richiede installazione e impartiamo i seguenti comandi da amministratore:

 nssm.exe install PythonApp "C:\Program Files\Python37\python.exe"    "C:\Users\Admin\Desktop\webserver.py"

possiamo poi avviare il servizio con :

nssm.exe start PythonApp

oppure modificarlo (Gui):

nssm.exe edit PythonApp

o eliminarlo:

nssm.exe remove PythonApp

programmazione/python/script_come_servizio_su_win32.txt · Ultima modifica: 20/02/2019 - 11:24 da Fabio Di Matteo