Service Python

service Windows [pywin32]

Vous pouvez exécuter un programme Python avec bat, mais c'est convivial si vous pouvez transformer le programme en cours d'exécution en service parce que vous ne savez pas ce qui est en cours d'exécution.

Donc, je vais résumer comment s'inscrire en tant que système

Méthode de réglage

  1. Vous devez passer le chemin à travers les variables d'environnement système Panneau de configuration \ Système et sécurité \ Système Paramètres système avancés → Variables d'environnement

Vérifiez si le chemin de la variable d'environnement système contient les éléments suivants

C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Scripts\

A également ajouté ce qui suit

C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Lib\site-packages\pywin32_system32
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Lib\site-packages\win32
  1. Exécutez à partir de l'invite de commande avec les privilèges d'administrateur Remarque: comment exécuter depuis l'administrateur Recherchez cmd → Application d'invite de commandes → Cliquez avec le bouton droit et exécutez depuis l'administrateur
pip install pywin32
  1. Enregistrement du service (démarrage différé automatique) Après vous être déplacé vers le répertoire contenant le fichier Python à systématiser, ouvrez une invite de commande avec des privilèges d'administrateur et exécutez la commande suivante.
$ python test.py --startup delayed install
  1. Exécution du service Ouvrez une invite de commande avec des privilèges d'administrateur et exécutez la commande suivante.
$ python test.py start
  1. Panne de service Ouvrez une invite de commande avec des privilèges d'administrateur et exécutez la commande suivante.
$ python test.py stop
  1. Supprimer le service Ouvrez une invite de commande avec des privilèges d'administrateur et exécutez la commande suivante.
$ python test.py remove

Exemple de code 1

# -*- coding:utf-8 -*-

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket

import time
import threading
import logging
import random

logging.basicConfig(
    filename = 'c:\\work\\test-service.log',
    level = logging.DEBUG, 
    format="%(asctime)s:LINE[%(lineno)s] %(levelname)s %(message)s"
)

INTERVAL = 10

class MySvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "test-service"
    _svc_display_name_ = "test service"

    #Initialisation de classe
    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

    #Panne de service
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stop_event)
        logging.info('Request to Stop Service...')
        self.stop_requested = True

    #Début du service
    def SvcDoRun(self):
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_,'')
        )
        
        #Appel de fonction de boucle principale
        self.main_loop()
        
    #Fonction de traitement principale
    def main_task(self):
        logging.debug('mainTask Start...55sec sleep')
        # time.sleep(55)
        logging.debug('Do Something...after 55sec')
    
    #Fonction de boucle principale
    def main_loop(self):
        logging.info('Début du service')
        exec_time = time.time()
        
        #Traitement en boucle
        while True:
            #Confirmation de la demande de fin
            if self.stop_requested:
                logging.info('Aire d'autoroute')
                break
                
            try: 
                #Lorsque la date et l'heure d'exécution sont dépassées
                if exec_time <= time.time():
                    
                    #Appel de traitement principal
                    self.main_task()
                    
                    #Définir la prochaine heure d'exécution
                    exec_time = exec_time + INTERVAL
                    
            except Exception as e:
                logging.error("Error occured.")
                
            # 0.1 seconde de sommeil
            time.sleep(0.1)

        logging.info("Panne de service")
        return

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

Exemple de code 2

.py:servicetest.py


import os
import win32service 
import win32serviceutil 
import win32event 
import datetime 
 
class SmallestPythonService(win32serviceutil.ServiceFramework): 
    #Nom du service
    _svc_name_ = "TESTServise" 
    #Afficher un nom(Affichez ceci sur l'écran de service) 
    _svc_display_name_ = "TEST Service" 
    #Description du service
    _svc_description_='Enregistrer les données dans le tableau des opérations de l'équipement à intervalles réguliers' 
    #Délai d'attente pour le signal(Cette fois 10 secondes= 10,000 millisecondes) 
    _timeout_Milliseconds = 10000 
 
    def __init__(self, args): 
        win32serviceutil.ServiceFramework.__init__(self, args) 
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 
 
    def SvcStop(self): 
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
        win32event.SetEvent(self.hWaitStop) 
 
    def SvcDoRun(self): 
        print('Début du service') 
        while 1: 
            #Attendez 10 secondes pour la signalisation de l'événement
            ret = win32event.WaitForSingleObject( 
                    self.hWaitStop, 
                    self._timeout_Milliseconds 
                    ) 
                #Panne de service(Les événements sont signalés)Si tel est le cas, arrêtez le traitement
            if ret == win32event.WAIT_OBJECT_0: 
                break 
 
            self.main_loop() 
 
    #Traitement réel du service
    def main_loop(self): 
 
        # print('Début du service') 
        #↓ ↓ Supprimé pour test test dans le répertoire d'exécution.Tester OK une fois le txt créé
        FILEADDR = os.path.dirname(os.path.abspath(__file__)) + '/test.txt'
        with open(FILEADDR, "a") as f:
            f.write("[Test] %s \n" % (datetime.datetime.now())) 
 
if __name__=='__main__': 
    win32serviceutil.HandleCommandLine(SmallestPythonService) 

Recommended Posts

Service Python
Python
python kafka
Les bases de Python ⑤
Résumé Python
Python intégré
Technique Python
Étudier Python
Compte à rebours Python 2.7
Mémorandum Python
astuces python
fonction python ①
Les bases de Python
Mémo Python
ufo-> python (3)
Notation d'inclusion Python
Installer python
Python Singleton
Les bases de Python ④
Mémorandum Python 2
mémo python
Python Jinja2
Incrément Python
atCoder 173 Python
[Python] fonction
Installation de Python
Installer Python 3.4.3.
Essayez Python
Mémo Python
Itératif Python
Algorithme Python
Python2 + mot2vec
[Python] Variables
Fonctions Python
Python sys.intern ()
Tutoriel Python
Fraction Python
underbar python C'est ce que
Résumé Python
Démarrer python
[Python] Trier
Remarque: Python
Les bases de Python ③
Sortie du journal python
Les bases de Python
[Scraping] Scraping Python
Mise à jour Python (2.6-> 2.7)
mémo python
Mémorandum Python
Python #sort
ufo-> python
Python nslookup
apprentissage de python
[Rpmbuild] Python 3.7.3.
Python au prorata (1)
mémorandum python
Télécharger Python
mémorandum python