Question

Je suis la définition de l'architecture d'un ensemble de programmes qui part de divers objets interdépendants stockées dans une base de données.Je veux de l'un des programmes d'agir comme un service qui offre un plus haut niveau de l'interface pour les opérations sur ces objets, et d'autres programmes pour accéder à des objets par le biais de ce service.

Je suis actuellement en visant Python et le framework Django comme les technologies à mettre en œuvre ce service avec.Je suis assez sûr que je figure comment daemonize le programme en Python sous Linux.Cependant, il est une option spec point que le système de support de Windows.J'ai peu d'expérience avec la programmation sous Windows et pas d'expérience avec tous les services de Windows.

Est-il possible d'exécuter un Python programmes en tant que service Windows (j'.e.exécuter automatiquement sans connexion de l'utilisateur)? Je ne vais pas nécessairement à mettre en œuvre la présente partie, mais j'ai besoin d'une idée de comment il allait faire pour décider de la conception, le long de ces lignes.

Edit:Merci pour toutes les réponses jusqu'à présent, ils sont assez complètes.Je voudrais savoir une chose: Comment est Windows au courant de mon service?Puis-je les gérer avec le natif de Windows utilitaires? Quel est l'équivalent de mettre une start/stop script dans /etc/init.d?

Était-ce utile?

La solution

Oui, vous pouvez.Je le fais à l'aide de la pythoncom bibliothèques qui viennent inclus avec ActivePython ou peut être installé avec pywin32 (Python pour Windows extensions).

C'est un squelette de base pour un service simple:

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)

Votre code d'aller dans le main() méthode—le plus souvent avec une sorte de boucle infinie qui peut être interrompu par le contrôle d'un drapeau, que vous définissez dans l' SvcStop méthode

Autres conseils

Bien que je upvoted choisi de répondre à quelques semaines en arrière, dans l'intervalle, j'ai lutté beaucoup plus à ce sujet.Il se sent comme ayant une installation de Python et utilisant des modules spéciaux pour exécuter un script en tant que service est tout simplement de la mauvaise façon.Quid de la portabilité et de tel?

Je suis tombé sur le merveilleux Non-sucer le Gestionnaire de Service, qui fait vraiment simple et sain d'esprit pour faire face avec les Services Windows.J'ai trouvé depuis que je pourrait passer des options à un service installé, j'ai pu tout aussi bien choisir mon Python exécutable et passer mon script comme une option.

Je n'ai pas encore essayé cette solution, mais je vais le faire dès maintenant et mettre à jour ce post au long du processus.Je m'intéresse également à l'aide de virtualenvs sur Windows, donc je pourrais venir avec un tutoriel, tôt ou tard, et un lien vers ici.

Il ya un couple de solutions de rechange pour l'installation en tant que service pratiquement tous les exécutables Windows.

Méthode 1:Utilisez instsrv et srvany de rktools.exe

Pour Windows Home Server ou Windows Server 2003 (fonctionne avec WinXP trop), le Windows Server 2003 Resource Kit Tools vient avec des utilitaires qui peuvent être utilisés en tandem pour cela, appelé instsrv.exe et srvany.exe.Voir cet article de base de connaissances Microsoft KB137890 pour plus de détails sur la façon d'utiliser ces utils.

Pour Windows Home Server, il y a une grande convivial wrapper pour ces utilitaires nommé judicieusement "Tout Service Installateur".

Méthode 2:Utilisation ServiceInstaller pour Windows NT

Il existe une autre alternative à l'aide de ServiceInstaller pour Windows NT (téléchargeable ici) avec instructions python disponible.Contrairement au nom, il fonctionne avec Windows 2000 et Windows XP.Voici quelques instructions pour savoir comment installer un script python en tant que service.

L'installation d'un script Python

Exécuter ServiceInstaller pour créer un nouveau service.(Dans cet exemple, il est supposé que python est installé à 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

Après l'installation, ouvrez le Control Panneau de l'applet Services, de sélectionner et de démarrer le PythonTest service.

Après ma première réponse, j'ai remarqué qu'il y ont été étroitement liés Q&A déjà posté sur DONC.Voir aussi:

Puis-je exécuter un script Python en tant que service (dans Windows)?Comment?

Comment puis-je faire de Windows conscience d'un service que j'ai écrit en Python?

La façon la plus simple d'y parvenir est d'utiliser native command sc.exe:

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

Références:

  1. https://technet.microsoft.com/en-us/library/cc990289(v=ws.11).aspx
  2. Lors de la création d'un service de sc.exe comment passer en paramètres de contexte?

La façon la plus simple est d'utiliser: NSSM - la Non-Sucer Gestionnaire de Service:

1 - faire le téléchargement sur https://nssm.cc/download

2 - installer le programme python en tant que service:Gagner invite en tant qu'admin

c:>nssm.exe installer WinService

3 - Sur NSSMs de la console:

chemin d'accès:C:\Python27\Python27.exe

Répertoire de démarrage:C:\Python27

Arguments:c:\WinService.py

4 - vérifiez que la création de services sur les services.msc

Explication étape par étape, comment le faire fonctionner :

1 - d'Abord, créez un fichier python selon le squelette de base mentionnés ci-dessus.Et de l'enregistrer sur un chemin par exemple :"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 - Sur cette étape, nous devons inscrire notre service.

Exécutez l'invite de commande en tant que administrateur et un type comme:

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

le premier argument de binpath est le chemin de python.exe

deuxième argument de binpath est le chemin d'accès de votre fichier python que nous avons déjà créé

Ne manquez pas que vous devriez mettre un espace après chaque "="signe.

Ensuite si tout est ok, vous devriez voir

[SC] CreateService SUCCÈS

Maintenant, votre python est installé en tant que service windows maintenant.Vous pouvez le voir dans le Gestionnaire de Service et de registre en vertu de l' :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services estService

3 - Ok maintenant.Vous pouvez commencer à votre service sur le service gestionnaire.

Vous pouvez exécuter chaque fichier python qui fournit ce service squelette.

J'ai commencé à l'hébergement en tant que service avec pywin32.

Tout était bien, mais j'ai rencontré le problème que le service n'a pas pu démarrer en moins de 30 secondes (délai d'expiration par défaut pour Windows) sur le démarrage du système.C'était important pour moi parce que Windows de démarrage a eu lieu en simultané sur plusieurs machines virtuelles sur une seule machine physique, et IO de la charge a été énorme.Les messages d'erreur ont été:

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.

J'ai combattu avec beaucoup pywin, mais a terminé avec l'aide de NSSM comme il l'a proposé dans cette réponse.Il était très facile de migrer vers elle.

La accepté de répondre à l'aide de win32serviceutil œuvres, mais qui se complique et rend le débogage et les changements plus difficile.Il est loin plus facile à utiliser NSSM (le Non-Sucer Service Manager).Vous écrivez et confortablement debug normal d'un programme en python et quand cela fonctionne enfin vous utilisez NSSM de l'installer comme un service en moins d'une minute:

À partir d'un taux élevé (admin) invite de commandes que vous exécutez nssm.exe install NameOfYourService et vous remplissez ces options:

  • chemin:(le chemin d'accès à python.exe par exemple C:\Python27\Python.exe)
  • Arguments:(le chemin d'accès à votre script python, par exemple c:\path\to\program.py)

Par ailleurs, si votre programme imprime les messages utiles que vous souhaitez conserver dans un fichier journal NSSM pouvez également gérer cela et beaucoup plus pour vous.

Pour tous ceux qui veulent créer un service dans VENV ou Pycharm !!!!!!!

Après la lecture de tous les anwsers et de créer des scripts, si vous pouvez l'exécuter python service.py install et python service.py debug, mais python service.py start n'a pas de réponse.

C'est peut-être causé par venv problème, parce que service windows votre service par exec PROJECT\venv\Lib\site-packages\win32\pythonservice.exe.

Vous pouvez utiliser powershell ou cmd pour tester votre service pour trouver plus d'erreur de détails.

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)

Si vous obtenez une erreur comme moi, alors vous pouvez le vérifier ma réponse à une autre question, j'ai corrigé et post mon code ici.

nssm sur python 3+

(J'ai converti mon .py fichier .exe avec pyinstaller)

nssm:comme l'a dit avant

  • exécuter nssm installer {Service}
  • Sur NSSMs de la console:

    chemin d'accès: path o\your\program.exe

    Répertoire de démarrage: chemin\vers\votre\ #comme le chemin, mais sans votre program.exe

    Arguments:vide

pysc: Gestionnaire de Contrôle de Service sur le langage Python

Exemple de script à exécuter en tant que service prises de 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()

Créer et démarrer le service

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

Arrêter et supprimer le service

import pysc

service_name = 'test_xmlrpc_server'

pysc.stop(service_name)
pysc.delete(service_name)
pip install pysc
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top