Sie können ein Python-Programm mit bat ausführen, aber es ist benutzerfreundlich, wenn Sie das ausgeführte Programm in einen Dienst verwandeln können, da Sie nicht wissen, was ausgeführt wird.
Also werde ich zusammenfassen, wie man sich als System registriert
Überprüfen Sie, ob der "Pfad" der "Systemumgebungsvariablen" Folgendes enthält
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Scripts\
Fügte auch Folgendes hinzu
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Lib\site-packages\pywin32_system32
C:\Users\〇〇〇〇\AppData\Local\Programs\Python\Python36\Lib\site-packages\win32
cmd
→ Eingabeaufforderungs-App → Klicken Sie mit der rechten Maustaste und führen Sie sie vom Administrator auspip 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"
#Klasseninitialisierung
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
#Dienstausfall
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.stop_event)
logging.info('Request to Stop Service...')
self.stop_requested = True
#Start des Dienstes
def SvcDoRun(self):
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,'')
)
#Funktionsaufruf der Hauptschleife
self.main_loop()
#Hauptverarbeitungsfunktion
def main_task(self):
logging.debug('mainTask Start...55sec sleep')
# time.sleep(55)
logging.debug('Do Something...after 55sec')
#Hauptschleifenfunktion
def main_loop(self):
logging.info('Start des Dienstes')
exec_time = time.time()
#Schleifenverarbeitung
while True:
#Bestätigung der Endanforderung
if self.stop_requested:
logging.info('Dienst anhalten')
break
try:
#Wenn das Ausführungsdatum und die Ausführungszeit überschritten werden
if exec_time <= time.time():
#Hauptverarbeitungsaufruf
self.main_task()
#Stellen Sie die nächste Ausführungszeit ein
exec_time = exec_time + INTERVAL
except Exception as e:
logging.error("Error occured.")
# 0.1 Sekunde Schlaf
time.sleep(0.1)
logging.info("Dienstausfall")
return
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MySvc)
.py:servicetest.py
import os
import win32service
import win32serviceutil
import win32event
import datetime
class SmallestPythonService(win32serviceutil.ServiceFramework):
#Dienstname
_svc_name_ = "TESTServise"
#Anzeigename(Zeigen Sie dies auf dem Servicebildschirm an)
_svc_display_name_ = "TEST Service"
#Leistungsbeschreibung
_svc_description_='Speichern Sie die Daten in regelmäßigen Abständen in der Gerätebetriebstabelle'
#Timeout-Zeit, um auf das Signal zu warten(Diesmal 10 Sekunden= 10,000 Millisekunden)
_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('Start des Dienstes')
while 1:
#Warten Sie 10 Sekunden auf die Ereignissignalisierung
ret = win32event.WaitForSingleObject(
self.hWaitStop,
self._timeout_Milliseconds
)
#Dienstausfall(Ereignisse werden signalisiert)Wenn ja, beenden Sie die Verarbeitung
if ret == win32event.WAIT_OBJECT_0:
break
self.main_loop()
#Tatsächliche Serviceverarbeitung
def main_loop(self):
# print('Start des Dienstes')
#↓ ↓ Für Test Test im Ausführungsverzeichnis gelöscht.Testen Sie OK, sobald txt erstellt wurde
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