Hvordan kjører du et Python-skript som en tjeneste i Windows?

stemmer
217

Jeg skissere arkitekturen for et sett med programmer som deler ulike beslektede gjenstander som er lagret i en database. Jeg vil ha et av programmene til å fungere som en tjeneste som gir et høyere nivå grensesnitt for operasjoner på disse objektene, og de andre programmene for å få tilgang objektene gjennom denne tjenesten.

Jeg er for tiden sikter til Python og Django rammeverk som teknologi for å implementere denne tjenesten med. Jeg er ganske sikker på at jeg finne hvordan man daemonize Python program i Linux. Men det er en valgfri spec element at systemet skal støtte Windows. Jeg har liten erfaring med Windows programmering og ingen erfaring i det hele tatt med Windows-tjenester.

Er det mulig å kjøre en Python-programmer som Windows-tjeneste (dvs. kjøre det automatisk uten brukerpålogging)? Jeg vil ikke nødvendigvis trenger å gjennomføre denne delen, men jeg trenger en viss idé hvordan det ville bli gjort for å avgjøre om å designe langs disse linjene.

Edit: Takk for alle svarene så langt, de er ganske omfattende. Jeg vil gjerne vite en ting: Hvor er Windows klar over min tjeneste? Kan jeg klare det med de innfødte Windows-verktøy? Hva er tilsvarende å sette en start / stopp-skript i /etc/init.d?

Publisert på 28/08/2008 klokken 14:28
kilden bruker
På andre språk...                            


11 svar

stemmer
224

Ja det kan du. Jeg gjør det ved hjelp av pythoncom bibliotekene som kommer inkludert med ActivePython eller kan installeres med pywin32 (Python for Windows extensions).

Dette er en grunnleggende skjelett for en enkel tjeneste:

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)

Koden ville gå i main()metode vanligvis med en slags uendelig løkke som kan bli avbrutt ved å sjekke et flagg, som du setter i SvcStopmetoden

Svarte 28/08/2008 kl. 14:39
kilden bruker

stemmer
30

Selv om jeg upvoted valgt svaret et par uker tilbake, i mellomtiden slet jeg mye mer med dette emnet. Det føles som å ha en spesiell Python installasjon og bruk av spesielle moduler for å kjøre et skript som en tjeneste er rett og slett på feil måte. Hva om portabilitet og slikt?

Jeg snublet over den fantastiske Non-suger Service Manager , som gjorde det veldig enkelt og fornuftig å håndtere Windows Services. Jeg skjønte siden jeg kunne passere alternativer til en installert tjeneste, kunne jeg like godt velge min Python kjørbar og passerer min script som et alternativ.

Jeg har ennå ikke prøvd denne løsningen, men jeg vil gjøre det akkurat nå, og oppdatere dette innlegget langs prosessen. Jeg er også interessert i å bruke virtualenvs på Windows, så jeg kan komme opp med en tutorial før eller senere, og link til det her.

Svarte 28/07/2014 kl. 13:41
kilden bruker

stemmer
24

Det er et par alternativer for å installere som en tjeneste nesten alle Windows kjørbar.

Metode 1: Bruk instsrv og srvany fra rktools.exe

For Windows Home Server eller Windows Server 2003 (fungerer med WinXP også), de Windows Server 2003 Resource Kit Tools kommer med verktøy som kan brukes i tandem for dette, kalt instsrv.exe og srvany.exe . Se denne Microsoft KB-artikkel KB137890 for informasjon om hvordan du bruker disse utils.

For Windows Home Server, er det en stor brukervennlig wrapper for disse verktøyene heter treffende " noen tjeneste Installer ".

Metode 2: Bruk ServiceInstaller for Windows NT

Det er et annet alternativ å bruke ServiceInstaller for Windows NT ( nedlasting-stand her ) med python instruksjoner som er tilgjengelige . I motsetning til navnet, det fungerer med både Windows 2000 og Windows XP også. Her er noen instruksjoner for hvordan du installerer et Python-skript som en tjeneste.

Installere et Python-skript

Kjør ServiceInstaller å skape en ny tjeneste. (I dette eksempel er det antatt at python er montert i c: \ python25)

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

Etter installasjon, åpne Kontrollpanel sin Services applet, velge og starte PythonTest tjenesten.

Etter min første svar, jeg la merke til var nært beslektet Q & A allerede lagt ut på SO. Se også:

Kan jeg kjøre en Python-skript som en tjeneste (i Windows)? Hvordan?

Hvordan gjør jeg Windows oppmerksom på en tjeneste jeg har skrevet i Python?

Svarte 28/02/2009 kl. 08:30
kilden bruker

stemmer
13

Den enkleste måten å oppnå dette på er å bruke Native Command sc.exe:

sc create PythonApp binPath= "C:\Python34\Python.exe --C:\tmp\pythonscript.py"
  1. https://technet.microsoft.com/en-us/library/cc990289(v=ws.11).aspx
  2. å skape en tjeneste med sc.exe; hvordan man skal passere i kontekstparameterne
Svarte 07/12/2016 kl. 12:23
kilden bruker

stemmer
7

Steg for steg forklaring på hvordan å gjøre det arbeidet:

1 Først oppretter en python fil i henhold til grunnleggende skjelett nevnt ovenfor. Og lagre den på en bane for eksempel: "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 - På dette trinnet skal vi registrere vår tjeneste.

Kjør ledetekst som administrator og skriv som:

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

den første argumentet binpath er den banen for python.exe

andre argumentet binpath er banen til python-fil som vi opprettet allerede

Ikke gå glipp av at du bør sette en plass etter hvert " = " tegn.

Så hvis alt er ok, bør du se

[SC] CreateService VELLYKKET

Nå python tjenesten er installert som Windows service nå. Du kan se det i Service Manager og registret etter:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService

3 Ok nå. Du kan starte tjenesten på service manager.

Du kan utføre hver python-fil som tilbyr denne tjenesten skjelett.

Svarte 29/06/2017 kl. 08:37
kilden bruker

stemmer
6

Den enkleste måten er å bruke: NSSM - Non-Sucking Service Manager:

1 - gjør nedlasting på https://nssm.cc/download

2 - installere python program som en tjeneste: Vinn be som admin

c:> nssm.exe installere WinService

3 - På NSSM's konsollen:

bane: C: \ Python27 \ Python27.exe

Oppstart katalog: C: \ Python27

Argumenter: c: \ WinService.py

4 - sjekk de opprettede tjenester på services.msc

Svarte 27/09/2017 kl. 14:05
kilden bruker

stemmer
2

Jeg begynte hosting som en tjeneste med pywin32 .

Alt var bra, men jeg møtte problemet at tjenesten ikke var i stand til å starte innen 30 sekunder (standard timeout for Windows) på systemoppstart. Det var viktig for meg fordi Windows oppstart fant sted samtidig på flere virtuelle maskiner vert på en fysisk maskin, og IO last var enorm. Feilmeldinger var:

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.

Jeg kjempet mye med pywin, men endte opp med å bruke NSSM som det ble foreslått i dette svaret . Det var veldig enkelt å migrere til det.

Svarte 12/10/2018 kl. 13:07
kilden bruker

stemmer
0

nssm på i python 3+

(Jeg konvertert min .py fil til .exe med pyinstaller)

nssm: som sagt før

  • drevet nssm installere {Tjeneste}
  • På NSSM's konsollen:

    bane: bane \ til \ ditt \ program.exe

    Oppstart katalogen: bane \ til \ ditt \ #same som banen, men uten din program.exe

    Argumenter: tom

Svarte 05/06/2019 kl. 00:42
kilden bruker

stemmer
0

For alle som ønsker å opprette tjenesten i Venv eller Pycharm !!!!!!!

Etter å ha lest alle anwsers og lage noen skript, hvis du kan kjøre python service.py installog python service.py debug, men python service.py starthar ikke noe svar.

Kanskje det er forårsaket av Venv problem, fordi Windows Service starter tjenesten ved exec PROJECT\venv\Lib\site-packages\win32\pythonservice.exe.

Du kan bruke powershelleller cmdtil å teste din tjeneste for å finne mer feil detaljer.

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)

Hvis du får noen feil som meg, så kan du sjekke svaret mitt i et annet spørsmål, jeg fikset det og legge koden min her .

Svarte 29/05/2019 kl. 08:57
kilden bruker

stemmer
0

Den aksepterte svaret ved hjelp av win32serviceutilgjerninger, men er komplisert og gjør debugging og endrer hardere. Det er langt enklere å bruke NSSM ( Non-Sucking Service Manager) . Du skriver og komfortabelt feilsøke en vanlig python program, og når det endelig fungerer du bruker NSSM å installere det som en tjeneste i mindre enn ett minutt:

Fra en forhøyet (admin) ledeteksten du kjører nssm.exe install NameOfYourServiceog du fylle inn disse alternativene:

  • sti : (banen til python.exe eksempel C:\Python27\Python.exe)
  • Argumenter : (banen til Python-skript, for eksempel c:\path\to\program.py)

Forresten, hvis programmet utskrifter nyttige meldinger som du ønsker å holde i en loggfil NSSM kan også håndtere dette og mye mer for deg.

Svarte 10/11/2018 kl. 15:52
kilden bruker

stemmer
-2

pysc: Tjenestekontrollbehandling på Python

Eksempel script til å kjøre som en tjeneste hentet fra 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()

Lag og starte tjenesten

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'))

Stopp og slett tjeneste

import pysc

service_name = 'test_xmlrpc_server'

pysc.stop(service_name)
pysc.delete(service_name)
pip install pysc
Svarte 03/03/2017 kl. 20:29
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more