Wie führt man ein Python-Skript als Dienst in Windows aus?

260

Ich skizziere die Architektur für eine Reihe von Programmen, die verschiedene miteinander verbundene Objekte gemeinsam nutzen, die in einer Datenbank gespeichert sind. Ich möchte, dass eines der Programme als Dienst fungiert, der eine übergeordnete Schnittstelle für Operationen an diesen Objekten bietet, und dass die anderen Programme über diesen Dienst auf die Objekte zugreifen.

Ich strebe derzeit Python und das Django-Framework als Technologien für die Implementierung dieses Dienstes an. Ich bin mir ziemlich sicher, wie ich das Python-Programm unter Linux dämonisieren kann. Es ist jedoch ein optionales Spezifikationselement, dass das System Windows unterstützen soll. Ich habe wenig Erfahrung mit Windows-Programmierung und überhaupt keine Erfahrung mit Windows-Diensten.

Ist es möglich, Python-Programme als Windows-Dienst auszuführen (dh automatisch ohne Benutzeranmeldung auszuführen)? Ich muss diesen Teil nicht unbedingt implementieren, aber ich brauche eine grobe Vorstellung davon, wie es gemacht werden würde, um zu entscheiden, ob ich in diese Richtung entwerfen soll.

Edit: Danke für alle Antworten bisher, sie sind ziemlich umfassend. Ich möchte noch eines wissen: Wie ist Windows auf meinen Dienst aufmerksam? Kann ich es mit den nativen Windows-Dienstprogrammen verwalten? Was entspricht dem Einfügen eines Start / Stopp-Skripts in /etc/init.d?

Hanno Fietz
quelle
2
Überprüfen Sie diese Windows-Dienstvorlage , die die win32service-API verwendet .
CMS

Antworten:

254

Ja, du kannst. Ich mache es mit den Pythoncom-Bibliotheken, die in ActivePython enthalten sind oder mit pywin32 (Python für Windows-Erweiterungen) installiert werden können .

Dies ist ein Grundgerüst für einen einfachen Service:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        pass

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

Ihr Code wird in die main()Methode aufgenommen - normalerweise mit einer Endlosschleife, die möglicherweise durch Überprüfen eines Flags unterbrochen wird, das Sie in der SvcStopMethode gesetzt haben

Ricardo Reyes
quelle
21
Wie kann ich Windows nach dem Codieren anweisen, dies als Dienst auszuführen?
Kit
33
@Kit: Führen Sie Ihr Skript mit der über die Befehlszeile mit dem Parameter "install" aus. Dann können Sie Ihre Anwendung in der Windows-Liste "Dienste" sehen, wo Sie sie starten, stoppen oder so einstellen können, dass sie automatisch startet
Ricardo Reyes
16
Sie erwähnen pythoncom besonders und importieren es in Ihren Beispielcode. Das Problem ist, dass Sie pythoncom niemals irgendwo in Ihrem Beispielcode verwenden, sondern nur importieren. Warum sollte man es besonders erwähnen und dann seine Verwendung nicht zeigen?
Buttons840
10
Warum für das socket.setdefaulttimeout(60)ist? Wird es für einen Dienst benötigt oder wurde es nur versehentlich von einem vorhandenen Dienst kopiert? :)
Timur
7
chrisumbel.com/article/windows_services_in_python Dies ist ein ähnliches Beispiel, aber vollständiger
csprabala
41

Obwohl ich die gewählte Antwort vor ein paar Wochen positiv bewertet habe, hatte ich in der Zwischenzeit viel mehr mit diesem Thema zu kämpfen. Es fühlt sich an, als wäre eine spezielle Python-Installation und die Verwendung spezieller Module zum Ausführen eines Skripts als Dienst einfach der falsche Weg. Was ist mit Portabilität und so?

Ich stolperte über den wunderbaren Non-Sucking Service Manager , der es wirklich einfach und vernünftig machte, mit Windows Services umzugehen. Ich dachte, da ich Optionen an einen installierten Dienst übergeben könnte, könnte ich genauso gut meine ausführbare Python-Datei auswählen und mein Skript als Option übergeben.

Ich habe diese Lösung noch nicht ausprobiert, werde dies aber jetzt tun und diesen Beitrag während des Vorgangs aktualisieren. Ich bin auch daran interessiert, virtualenvs unter Windows zu verwenden, daher könnte ich früher oder später ein Tutorial erstellen und hier darauf verlinken.

mknaf
quelle
Etwas Glück? Ich erstelle eine sehr einfache Site für einen Client und muss nicht den gesamten Apache-Stack verwenden. Auch das Erstellen des Dienstes selbst hat sich wie eine Einladung zu Problemen angehört, wie ich aus anderen Kommentaren gelesen habe.
Jaran
Ja, das funktioniert und es ist sehr einfach zu tun. Sie geben nur den Pfad und die Argumente für das Skript an. Ich konnte meine dazu bringen, ohne Konsole zu laufen, für den Fall, dass jemand irgendwie ein Konsolenfenster hat.
kmcguire
Während dies anscheinend funktioniert, gibt es andere Schwierigkeiten, insbesondere wenn Sie "nicht den gesamten Apache-Stack verwenden müssen": Gunicorn zum Beispiel läuft noch nicht unter Windows, was eigentlich der Showstopper für mich war.
Mknaf
4
Der Trick hier ist, python.exe als Dienst und Ihr Python-Skript als Parameter auszuführen: wie "nssm install MyServiceName c: \ python27 \ python.exe c: \ temp \ myscript.py"
poleguy
Funktioniert super! Auf einem System mit mehreren virtuellen Umgebungen kann der Pfad auf die Python-Interpreter-Exe im Skriptverzeichnis der gewünschten virtuellen Umgebung verweisen. Es scheint, als ob new-servicePowerShell dies tun sollte, aber das Starten (und Überwachen) eines Skripts als Dienst beinhaltet offensichtlich viel mehr Details, um die sich nssm sehr gut kümmert.
Fred Schleifer
26

Der einfachste Weg ist die Verwendung von: NSSM - dem Non-Sucking Service Manager:

1 - Download unter https://nssm.cc/download

2 - Installieren Sie das Python-Programm als Dienst: Win-Eingabeaufforderung als Administrator

c:> nssm.exe installiert WinService

3 - Auf der NSSM-Konsole:

Pfad: C: \ Python27 \ Python27.exe

Startverzeichnis: C: \ Python27

Argumente: c: \ WinService.py

4 - Überprüfen Sie die erstellten Dienste auf services.msc

Adriano RPL
quelle
Früher habe ich nssm.exe verwendet, um meine Visual Studio C ++ .exe als Dienst zu installieren, und jetzt kann ich nssm.exe auch für meine Python .pyc als Dienst verwenden. Vielen Dank.
Etoricky
Hinweis: Wenn sich Ihr * .py-Skript in einem Ordner mit Speicherplatz befindet (z. B. C: \ Programme \ myapp.py), müssen Argumente in Anführungszeichen angegeben werden: Argumente: "C: \ Programme \ myapp.py"
Yury Kozlov
Wie kann eine virtuelle Umgebung bereitgestellt werden?
Shaik Moeed
24

Der einfachste Weg, dies zu erreichen, ist die Verwendung des nativen Befehls sc.exe:

sc create PythonApp binPath= "C:\Python34\Python.exe --C:\tmp\pythonscript.py"

Verweise:

  1. https://technet.microsoft.com/en-us/library/cc990289(v=ws.11).aspx
  2. Wie werden beim Erstellen eines Dienstes mit sc.exe Kontextparameter übergeben?
pyOwner
quelle
Ich denke, es ist ein Problem mit Ihrem Befehl oder Ihrer Anwendung. Überprüfen Sie auf
jeden Fall
Meine App funktioniert auch außerhalb des Dienstes einwandfrei, und ich habe denselben Code wie oben ohne Ergebnis verwendet.
Nimeresam
Wie kann eine virtuelle Umgebung bereitgestellt werden?
Shaik Moeed
Hast du virtualenv ausprobiert?
PyOwner
1
Das funktioniert nicht. Ein Windows-Dienst muss eine bestimmte Schnittstelle verfügbar machen, die das pywin32-Paket ausführt. Ein einfaches altes Python-Skript reicht jedoch nicht aus.
Siddhartha Gandhi
23

Es gibt einige Alternativen für die Installation praktisch jeder ausführbaren Windows-Datei als Dienst.

Methode 1: Verwenden Sie instsrv und srvany aus rktools.exe

Für Windows Home Server oder Windows Server 2003 (funktioniert auch mit WinXP) enthalten die Windows Server 2003 Resource Kit-Tools Dienstprogramme, die zusammen verwendet werden können: instsrv.exe und srvany.exe . Weitere Informationen zur Verwendung dieser Dienstprogramme finden Sie in diesem Microsoft KB-Artikel KB137890 .

Für Windows Home Server gibt es einen großartigen benutzerfreundlichen Wrapper für diese Dienstprogramme mit dem treffenden Namen " Any Service Installer ".

Methode 2: Verwenden Sie ServiceInstaller für Windows NT

Es gibt eine andere Alternative mit ServiceInstaller für Windows NT (hier herunterladbar ) mit verfügbaren Python-Anweisungen . Im Gegensatz zum Namen funktioniert es sowohl mit Windows 2000 als auch mit Windows XP. Hier finden Sie einige Anweisungen zum Installieren eines Python-Skripts als Dienst.

Installieren eines Python-Skripts

Führen Sie ServiceInstaller aus, um einen neuen Dienst zu erstellen. (In diesem Beispiel wird davon ausgegangen, dass Python unter c: \ python25 installiert ist.)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:\python25\python.exe
Arguments : c:\path_to_your_python_script\test.py
Working Directory : c:\path_to_your_python_script

Öffnen Sie nach der Installation das Applet "Dienste" der Systemsteuerung, wählen Sie den PythonTest-Dienst aus und starten Sie ihn.

Nach meiner ersten Antwort bemerkte ich, dass bereits eng verwandte Fragen und Antworten auf SO veröffentlicht wurden. Siehe auch:

Kann ich ein Python-Skript als Dienst ausführen (unter Windows)? Wie?

Wie mache ich Windows auf einen Dienst aufmerksam, den ich in Python geschrieben habe?

popcnt
quelle
Ich habe gerade bemerkt, dass es bereits andere ähnliche Fragen und Antworten gibt
popcnt
Service Installer arbeitet nicht mit einer 64-Bit-Architektur, daher wird Option 1 zur Option goto.
Noah Campbell
Der obige Link zu ServiceInstaller funktioniert nicht mehr. Ich fand es hier: sites.google.com/site/conort/…
LarsH
2
Ich glaube nicht, dass NTdies dem Namen unbedingt "widersprechen" würde, zumindest nicht in der Sprache der Programmierer. Es bezieht sich nur auf die "NT- Architektur " im Gegensatz zur "NT- Marke ". Laut Wikipedia-Vortrag steht dies jedoch zur Debatte, da "es sich nicht um einen offiziellen Microsoft-Begriff handelt", aber es gibt dennoch eine Tradition mit dieser Denkweise.
n611x007
15

Schritt für Schritt Erklärung, wie es funktioniert:

1- Erstellen Sie zunächst eine Python-Datei gemäß dem oben genannten Grundgerüst. Und speichern Sie es in einem Pfad, zum Beispiel: "c: \ PythonFiles \ AppServerSvc.py"

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"


    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                          servicemanager.PYS_SERVICE_STARTED,
                          (self._svc_name_,''))
        self.main()

    def main(self):
        # Your business logic or call to any class should be here
        # this time it creates a text.txt and writes Test Service in a daily manner 
        f = open('C:\\test.txt', 'a')
        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            f.write('Test Service  \n')
            f.flush()
            # block for 24*60*60 seconds and wait for a stop event
            # it is used for a one-day loop
            rc = win32event.WaitForSingleObject(self.hWaitStop, 24 * 60 * 60 * 1000)
        f.write('shut down \n')
        f.close()

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

2 - In diesem Schritt sollten wir unseren Service registrieren.

Führen Sie die Eingabeaufforderung als Administrator aus und geben Sie Folgendes ein:

sc create TestService binpath = "C: \ Python36 \ Python.exe c: \ PythonFiles \ AppServerSvc.py" DisplayName = "TestService" start = auto

Das erste Argument von binpath ist der Pfad von python.exe

Das zweite Argument von binpath ist der Pfad Ihrer Python-Datei , die wir bereits erstellt haben

Verpassen Sie nicht, dass Sie nach jedem " = " - Zeichen ein Leerzeichen setzen sollten .

Wenn dann alles in Ordnung ist, sollten Sie sehen

[SC] CreateService SUCCESS

Jetzt ist Ihr Python-Dienst jetzt als Windows-Dienst installiert. Sie können es in Service Manager und Registrierung unter sehen:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService

3- Ok jetzt. Sie können Ihren Dienst über den Service Manager starten.

Sie können jede Python-Datei ausführen, die dieses Service-Skelett bereitstellt.

Seckin Sanli
quelle
Es gibt viele schlechte Beispiele für die Verwendung von SetEvent(self.hWaitStop)und WaitForSingleObject. Basierend auf gedankenlosem Kopieren der ausgewählten Antwort hier wahrscheinlich. Dies ist eine gute Möglichkeit, die sowohl für das "Debug" als auch für die "Stop" -Argumente sauber funktioniert. (Der Teil über die Verwendung von SC scheint redundant zu sein, wenn HandleCommandLineder Job ausgeführt wird, und kann debuggen.)
Alias_Knagg
3

pysc: Service Control Manager unter Python

Beispielskript zur Ausführung als Dienst von pythonhosted.org :

from xmlrpc.server import SimpleXMLRPCServer

from pysc import event_stop


class TestServer:

    def echo(self, msg):
        return msg


if __name__ == '__main__':
    server = SimpleXMLRPCServer(('127.0.0.1', 9001))

    @event_stop
    def stop():
        server.server_close()

    server.register_instance(TestServer())
    server.serve_forever()

Service erstellen und starten

import os
import sys
from xmlrpc.client import ServerProxy

import pysc


if __name__ == '__main__':
    service_name = 'test_xmlrpc_server'
    script_path = os.path.join(
        os.path.dirname(__file__), 'xmlrpc_server.py'
    )
    pysc.create(
        service_name=service_name,
        cmd=[sys.executable, script_path]
    )
    pysc.start(service_name)

    client = ServerProxy('http://127.0.0.1:9001')
    print(client.echo('test scm'))

Beenden und löschen Sie den Dienst

import pysc

service_name = 'test_xmlrpc_server'

pysc.stop(service_name)
pysc.delete(service_name)
pip install pysc
Seliverstov Maksim
quelle
3
Weiß jemand, warum dies eine Abwertung bekommen hat? Es sieht nach einer schönen Lösung aus.
Jarrod Chesney
3

Ich habe angefangen, als Service mit pywin32 zu hosten .

Alles war gut, aber ich habe das Problem festgestellt, dass der Dienst beim Systemstart nicht innerhalb von 30 Sekunden (Standardzeitlimit für Windows) gestartet werden konnte. Dies war für mich von entscheidender Bedeutung, da der Windows-Start gleichzeitig auf mehreren virtuellen Maschinen erfolgte, die auf einer physischen Maschine gehostet wurden, und die E / A-Last enorm war. Fehlermeldungen waren:

Error 1053: The service did not respond to the start or control request in a timely fashion.

Error 7009: Timeout (30000 milliseconds) waiting for the <ServiceName> service to connect.

Ich habe viel mit Pywin gekämpft, aber am Ende habe ich NSSM verwendet, wie es in dieser Antwort vorgeschlagen wurde . Es war sehr einfach, dorthin zu migrieren.

flam3
quelle
2

nssm in Python 3+

(Ich habe meine .py-Datei mit pyinstaller in .exe konvertiert )

nssm: wie gesagt

  • Führen Sie nssm install {ServiceName} aus
  • Auf der NSSM-Konsole:

    Pfad: Pfad \ zu \ Ihrer \ program.exe

    Startverzeichnis : Pfad \ zu \ Ihrem \ #same als Pfad, jedoch ohne Ihre program.exe

    Argumente: leer

Wenn Sie Ihr Projekt nicht in .exe konvertieren möchten

  • Erstellen Sie eine .bat-Datei mit python {{your python.py file name}}
  • und legen Sie den Pfad zur .bat-Datei fest
Codierer
quelle
Wie kann eine virtuelle Umgebung bereitgestellt werden?
Shaik Moeed
1

Ein vollständiges pywin32-Beispiel mit Schleife oder Subthread

Nachdem ich ein paar Tage daran gearbeitet habe, ist hier die Antwort, die ich gerne gefunden hätte: Verwenden Sie pywin32, um es schön und eigenständig zu halten.

Dies ist der vollständige Arbeitscode für eine schleifenbasierte und eine threadbasierte Lösung. Es kann sowohl auf Python 2 als auch auf Python 3 funktionieren, obwohl ich nur die neueste Version auf 2.7 und Win7 getestet habe. Die Schleife sollte für das Abrufen von Code geeignet sein, und das Profil sollte mit mehr serverähnlichem Code funktionieren. Es scheint gut mit dem Kellnerin wsgi Server zu funktionieren, der keine Standardmethode zum ordnungsgemäßen Herunterfahren hat.

Ich möchte auch zu beachten , dass es scheint , gibt jede Menge Beispiele zu sein, wie dies die fast nützlich sind, aber in Wirklichkeit irreführend, weil sie geschnitten und geklebt andere Beispiele haben blind. Ich könnte falsch liegen. Aber warum ein Ereignis erstellen, wenn Sie nie darauf warten?

Trotzdem fühle ich mich hier immer noch auf etwas wackeligem Boden, insbesondere was die Sauberkeit des Ausgangs aus der Thread-Version betrifft, aber zumindest glaube ich, dass es nichts gibt irreführend ist.

Kopieren Sie zum Ausführen einfach den Code in eine Datei und befolgen Sie die Anweisungen.

aktualisieren:

Verwenden Sie ein einfaches Flag, um den Thread zu beenden. Das wichtige Bit ist, dass "Thread erledigt" gedruckt wird.
Ein ausführlicheres Beispiel für das Verlassen eines nicht kooperativen Server-Threads finden Sie in meinem Beitrag über den wsgi-Server der Kellnerin .

# uncomment mainthread() or mainloop() call below
# run without parameters to see HandleCommandLine options
# install service with "install" and remove with "remove"
# run with "debug" to see print statements
# with "start" and "stop" watch for files to appear
# check Windows EventViever for log messages

import socket
import sys
import threading
import time
from random import randint
from os import path

import servicemanager
import win32event
import win32service
import win32serviceutil
# see http://timgolden.me.uk/pywin32-docs/contents.html for details


def dummytask_once(msg='once'):
    fn = path.join(path.dirname(__file__),
                '%s_%s.txt' % (msg, randint(1, 10000)))
    with open(fn, 'w') as fh:
        print(fn)
        fh.write('')


def dummytask_loop():
    global do_run
    while do_run:
        dummytask_once(msg='loop')
        time.sleep(3)


class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global do_run
        do_run = True
        print('thread start\n')
        dummytask_loop()
        print('thread done\n')

    def exit(self):
        global do_run
        do_run = False


class SMWinservice(win32serviceutil.ServiceFramework):
    _svc_name_ = 'PyWinSvc'
    _svc_display_name_ = 'Python Windows Service'
    _svc_description_ = 'An example of a windows service in Python'

    @classmethod
    def parse_command_line(cls):
        win32serviceutil.HandleCommandLine(cls)

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.stopEvt = win32event.CreateEvent(None, 0, 0, None)  # create generic event
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                            servicemanager.PYS_SERVICE_STOPPED,
                            (self._svc_name_, ''))
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stopEvt)  # raise event

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                            servicemanager.PYS_SERVICE_STARTED,
                            (self._svc_name_, ''))
        # UNCOMMENT ONE OF THESE
        # self.mainthread()
        # self.mainloop()

    # Wait for stopEvt indefinitely after starting thread.
    def mainthread(self):
        print('main start')
        self.server = MyThread()
        self.server.start()
        print('wait for win32event')
        win32event.WaitForSingleObject(self.stopEvt, win32event.INFINITE)
        self.server.exit()
        print('wait for thread')
        self.server.join()
        print('main done')

    # Wait for stopEvt event in loop.
    def mainloop(self):
        print('loop start')
        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            dummytask_once()
            rc = win32event.WaitForSingleObject(self.stopEvt, 3000)
        print('loop done')


if __name__ == '__main__':
    SMWinservice.parse_command_line()
Alias_Knagg
quelle
0

Die akzeptierte Antwort mit win32serviceutilfunktioniert funktioniert, ist jedoch kompliziert und erschwert das Debuggen und Ändern. Es ist viel einfacher, NSSM ( den Non-Sucking Service Manager) zu verwenden . Sie schreiben ein normales Python-Programm und debuggen es bequem. Wenn es endlich funktioniert, verwenden Sie NSSM, um es in weniger als einer Minute als Dienst zu installieren:

An einer Eingabeaufforderung mit erhöhten Rechten (admin) führen nssm.exe install NameOfYourServiceSie diese aus und geben folgende Optionen ein:

  • Pfad : (der Pfad zu python.exe zB C:\Python27\Python.exe)
  • Argumente : (der Pfad zu Ihrem Python - Skript, zum Beispiel c:\path\to\program.py)

Übrigens, wenn Ihr Programm nützliche Nachrichten druckt, die Sie in einer Protokolldatei aufbewahren möchten, kann NSSM dies und vieles mehr auch für Sie erledigen.

ndemou
quelle
Ja, dies ist ein Duplikat von Adrianos Antwort. Ich habe diese Antwort positiv bewertet und versucht, sie zu bearbeiten, aber nach den Änderungen habe ich mir eine neue Antwort angesehen.
Ndemou
Wie kann eine virtuelle Umgebung bereitgestellt werden?
Shaik Moeed
0

Für alle, die einen Service in VENV oder Pycharm erstellen möchten !!!!!!!

Nachdem Sie alle Antworten gelesen und einige Skripte erstellt haben, können Sie python service.py installund ausführen python service.py debug, aberpython service.py start keine Antwort.

Möglicherweise liegt es an einem venv-Problem, weil der Windows-Dienst Ihren Dienst über exec startet PROJECT\venv\Lib\site-packages\win32\pythonservice.exe.

Sie können Ihren Dienst verwenden powershelloder cmdtesten, um weitere Fehlerdetails zu finden.

PS C:\Users\oraant> E:

PS E:\> cd \Software\PythonService\venv\Lib\site-packages\win32

PS E:\Software\PythonService\venv\Lib\site-packages\win32> .\pythonservice.exe -debug ttttt
Debugging service ttttt - press Ctrl+C to stop.
Error 0xC0000004 - Python could not import the service's module

Traceback (most recent call last):
  File "E:\Software\PythonService\my_service.py", line 2, in <module>
    import win32serviceutil
ModuleNotFoundError: No module named 'win32serviceutil'

(null): (null)

Wenn Sie wie ich einen Fehler erhalten, können Sie meine Antwort in einer anderen Frage überprüfen. Ich habe sie behoben und meinen Code hier veröffentlicht .

oraant
quelle
-1

https://www.chrisumbel.com/article/windows_services_in_python

  1. Folgen Sie der PySvc.py

  2. Ändern des DLL-Ordners

Ich weiß, dass das alt ist, aber ich war für immer dabei. Für mich wurde dieses spezielle Problem durch Kopieren dieser Datei - pywintypes36.dll - gelöst

Von -> Python36 \ Lib \ site-packages \ pywin32_system32

Zu -> Python36 \ Lib \ site-packages \ win32

setx /M PATH "%PATH%;C:\Users\user\AppData\Local\Programs\Python\Python38-32;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Scripts;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\pywin32_system32;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\win32
  1. Ändern des Pfads zum Python-Ordner durch

cd C:\Users\user\AppData\Local\Programs\Python\Python38-32

  1. NET START PySvc
  2. NET STOP PySvc
Gunarajulu Renganathan
quelle