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
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
cmd
→ Application d'invite de commandes → Cliquez avec le bouton droit et exécutez depuis l'administrateurpip install pywin32
$ python test.py --startup delayed install
$ python test.py start
$ python test.py stop
$ python test.py remove
# -*- 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)
.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