Python 3 Windows Sevice startet nur im Debug-Modus

Ich habe in diesem Beitrag eine Antwort geschrieben, aber es stimmt nicht mit den Forenstandards überein. Ich hoffe diesmal te Antwort passt zu den Forenstandards. Dieser Code sollte klarer und einfacher zu lesen sein.

In Python 3+ habe ich die folgende Klasse, die ich verwende, um einen Windows Service zu erstellen (es tut nichts, schreibt nur eine Logdatei):

#MyWindowsService.py import win32serviceutil import servicemanager import win32service import win32event import sys import logging import win32api class MyWindowsService(win32serviceutil.ServiceFramework): _svc_name_ = 'ServiceName' _svc_display_name_ = 'Service Display Name' _svc_description_ = 'Service Full Description' logging.basicConfig( filename = 'c:\\Temp\\{}.log'.format(_svc_name_), level = logging.DEBUG, format = '%(levelname)-7.7s @ %(asctime)s: %(message)s' ) def __init__(self, *args): self.log('Initializing service {}'.format(self._svc_name_)) win32serviceutil.ServiceFramework.__init__(self, *args) self.stop_event = win32event.CreateEvent(None, 0, 0, None) def SvcDoRun(self): self.ReportServiceStatus(win32service.SERVICE_START_PENDING) try: self.log('START: Service start') self.ReportServiceStatus(win32service.SERVICE_RUNNING) self.start() win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE) except Exception as e: self.log('Exception: {}'.format(e)) self.SvcStop() def SvcStop(self): self.log('STOP: Service stopping...') self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.stop() win32event.SetEvent(self.stop_event) self.ReportServiceStatus(win32service.SERVICE_STOPPED) def log(self, msg): servicemanager.LogInfoMsg(str(msg)) #system log logging.info(str(msg)) #text log def start(self): self.runflag = True while self.runflag: win32api.Sleep((2*1000), True) self.log('Service alive') def stop(self): self.runflag = False self.log('Stop received') if __name__ == '__main__': win32serviceutil.HandleCommandLine(MyWindowsService) 

Im Skript verwende ich eine Protokolldatei, um zu überprüfen, ob es richtig funktioniert. Ich laufe python3.6 (auch versucht mit python3.4) auf Windows 7 und ich erlebe das folgende Problem. Wenn ich python MyWindowsService.py install laufen python MyWindowsService.py install die Eingabeaufforderung sagt, dass der Dienst installiert wurde (aber nichts ist in der Protokolldatei geschrieben). Wenn ich versuche, den Service zu starten, bekomme ich Service Error: 1 – Mehr Infos NET HELPMSG 3547 was nicht viel über den Fehler sagt. Wenn ich python MyWindowsService.py debug laufen, läuft das Programm ganz gut (die Log-Datei ist geschrieben), aber trotzdem habe ich keine Kontrolle über den Service: Wenn ich eine weitere Aufforderung öffne und versuche zu stoppen / starten Sie den Service ich noch Bekam die gleichen Ergebnisse wie oben angegeben.

Ich habe auch versucht, einige Debug-Code in der init- Funktion einzufügen, und wenn ich Python MyWindowsService.py installieren, scheint es, dass es nicht aufgerufen wird. Ist es möglich?

Ich habe auf mehrere Lösung und Workarounds um das Netz überprüft, aber ich fand nichts passendes. Was vermisse ich?

One Solution collect form web for “Python 3 Windows Sevice startet nur im Debug-Modus”

Wie von eriksun in der kommentierung zum ersten posten gezeigt, kam das problem von der standort des python-skripts, das war in einem fahrzeug, das mit einem UNC-pfad abgebildet wurde – ich arbeite mit einer virtuellen maschine. Das Verschieben des Python-Skripts im selben Laufwerk wie die Python-Installation hat den Job gemacht. Um es für zukünftige Verwendungen zusammenzufassen, wenn der Service nicht anfängt und du bist ziemlich sicher über deinen Code, das sind hilfreiche Maßnahmen, um zu versuchen und deine Probleme zu lösen:

  • Verwenden Sie sc start ServiceName , sc query ServiceName und sc stop ServiceName , um Informationen über den Dienst zu erhalten.
  • Überprüfen Sie, ob sich Ihre Datei in einem physischen Laufwerk befindet oder in einem UNC-zugeordneten Laufwerk. Wenn diese versuchen, das Skript mit dem UNC-Pfad auszuführen (z. B. python \\Server\share\python\your-folder\script.py ) oder verschieben Sie Ihr Skript in das gleiche Laufwerk wie die Python-Installation
  • Stellen Sie sicher, dass "python36.dll", "vcruntime140.dll" und "pywintypes36.dll" entweder symlink'd in das Verzeichnis, das PythonService.exe hat; Oder symlink'd zum System32-Verzeichnis; Oder dass die Verzeichnisse mit diesen DLLs im System sind (nicht Benutzer) Pfad
  • Überprüfen Sie das Systemregister mit der Befehlsregistrierung reg query HKLM\System\CurrentControlSet\Services\your_service_name /s , um weitere Informationen über das Skript zu erhalten

PLease, fühlen Sie sich frei zu vervollständigen, ändern, ändern Sie die letzten, so dass es nützlich sein kann für jedermann, das wie ich encounder dieses Problem.

EDIT: Noch eine Sache … Mein Projekt wurde gedacht, um tatsächlich mit Netzwerkordnern zu arbeiten (und UNC-abgebildete Laufwerk) und es scheiterte, als ich versuchte, es als Dienst zu führen. Eine sehr nützliche (tagesrettende) Ressource, die ich verwendet habe, um es zu machen, ist die SysinternalsSuite von Mark Russinovich , die ich in diesem Beitrag gefunden habe . Hoffe das hilft.

  • Bearbeiten von Windows-Registry, von Python, unter Linux
  • WindowsError: [Fehler 126] beim Laden einer DLL mit Ctypes
  • Proxy-Authentifizierungsfehler in Urllib2 (Python 2.7)
  • Wurzel-Dialog in Python unter Mac OS X, Windows?
  • Führen Sie Python-Binärdateien unter Windows XP aus
  • Pyinstaller exe funktioniert nicht, wenn ich das Icon ändere
  • Bizzarre Problem versucht, Rpy2 2.1.9 Arbeit mit R 2.12.1, mit Python 2.6 unter Windows XP - Rpy kann nicht finden, die R.dll?
  • MAC-Adresse erhalten
  • Key-Echo in Python im separaten Thread zeigt keinen ersten Tastendruck an
  • Redirect-Ausgabe in eine Textdatei mit Windows-Shell '>' in Python
  • Kann nicht python in git terminal laufen?
  • Python ist die beste Programmiersprache der Welt.