Python 3 exécutable en tant que service Windows

J’essaie d’écrire un service Windows en python, mais la partie la plus délicate est que je veux le déployer sur une machine qui n’a pas de python. J’ai réussi à créer un service comme celui -ci et cela fonctionne si je cours à partir de ma machine. le problème commence lorsque j’essaie de le convertir en un exe, puis tente de l’installer. J’ai d’abord essayé d’utiliser l’exemple de service cx_freeze, (vu ici ), le setup.py ressemble à ceci:

from cx_Freeze import setup, Executable options = {'build_exe': {'includes': ['ServiceHandler']}} executables = [Executable('Config.py', base='Win32Service', targetName='gsr.exe')] setup(name='GSR', version='0.1', description='GSR SERVICE', executables=executables, options=options ) 

et config.py est:

 NAME = 'GSR_%s' DISPLAY_NAME = 'GSR TEST - %s' MODULE_NAME = 'ServiceHandler' CLASS_NAME = 'Handler' DESCRIPTION = 'Sample service description' AUTO_START = True SESSION_CHANGES = False 

mais quand j’essaie de le construire (python setup.py build), je reçois une erreur: “cx_Freeze.freezer.ConfigError: pas de base nommée Win32Service”

Deuxièmement, j’ai essayé d’utiliser une configuration régulière de cx_freeze, l’exe que j’obtiens installe bien le service, mais une fois que j’essaie de le démarrer, je reçois une erreur: “Erreur 1053: le service n’a pas répondu à la demande de démarrage ou de contrôle”

setup.py – python 3.3 regualr exe, installe le service mais en essayant de le démarrer il envoie une erreur:

 from cx_Freeze import setup, Executable packages = ['win32serviceutil','win32service','win32event','servicemanager','socket','win32timezone','cx_Logging','ServiceHandler'] build_exe_options = {"packages": packages} executable = [Executable("ServiceHandler.py")] setup( name = "GSR_test", version = "1.0", description = "GSR test service", options = {"build_exe": build_exe_options}, executables = executable) 

enfin, j’ai réussi à le faire fonctionner dans python 2.7 en utilisant py2exe, mais py2exe n’est pas disponible pour python 3.3 et mon code est en 3.3

Je suppose que le problème réside dans la configuration de setup.py im en utilisant cx_freeze. des idées ??

mon ServiceHandler:

 import pythoncom import win32serviceutil import win32service import win32event import servicemanager import socket from test import test import threading class AppServerSvc (win32serviceutil.ServiceFramework): _svc_name_ = "GSR_test" _svc_display_name_ = "GSR test Service" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout(60) self.app = test() self.flag = threading.Event() def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) self.flag.set() def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'')) self.main() def main(self): t = threading.Thread(target=self.app.run) t.start() self.flag.wait() raise SystemExit if __name__ == '__main__': win32serviceutil.HandleCommandLine(AppServerSvc) 

Setup.py, python 2.7 utilisant py2exe qui fonctionne: (pris ici )

 from distutils.core import setup import py2exe setup( service = ["ServiceHandler"], description = "SERVICE TEST", modules = ["GSR_test"], cmdline_style='pywin32', ) 

Merci Amit

    tldr Python 3.5 Windows Service construit avec le programme de désinstallation: gist

    Voici un service Windows simple avec python:

    WindowsService.py

     import servicemanager import socket import sys import win32event import win32service import win32serviceutil class TestService(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): rc = None while rc != win32event.WAIT_OBJECT_0: with open('C:\\TestService.log', 'a') as f: f.write('test service running...\n') rc = win32event.WaitForSingleObject(self.hWaitStop, 5000) if __name__ == '__main__': if len(sys.argv) == 1: servicemanager.Initialize() servicemanager.PrepareToHostSingle(TestService) servicemanager.StartServiceCtrlDispatcher() else: win32serviceutil.HandleCommandLine(TestService) 

    Créez un exe avec pyinstaller ( pip install pyinstaller ) et python 3.5:

     (env)$ python -V Python 3.5.2 (env)$ pip freeze PyInstaller==3.2 (env)$ pyinstaller -F --hidden-import=win32timezone WindowsService.py 

    Installer et exécuter le service

     (env) dist\WindowsService.exe install Installing service TestService Service installed (env) dist\WindowsService.exe start Starting service TestService 

    Vérifiez le fichier C:\\TestService.log .

    Arrêter et nettoyer

     (env) dist\WindowsService.exe stop (env) dist\WindowsService.exe remove 

    Il semble que Win32Service a été mis à jour avec le support Python 3.x dans le projet cx_Freeze à la suite de ce thread . Cet utilisateur avait à l’origine le même problème que vous avez signalé, donc je suppose que cela résoudra également votre problème.

    En fonction de l’erreur signalée, cela se produit lorsque _GetBaseFileName () dans Freezer.py ne parvient pas à trouver le fichier Win32Service.exe compilé. Cet exécutable doit être construit lorsque cx_Freeze est construit / installé .

    Si ce n’est pas trop demander, vous pouvez rechercher le répertoire “Win32Service.exe” dans le répertoire d’installation de cx_Freeze installé et confirmer qu’il existe. J’espère que cela vous rapproche un peu.

    J’ai édité le Win32Service.c dans le cx_freeze src pour le support python3

    L’édité avec quelques commandes de préprocesseur, pour le support de python2 aussi (mais pas encore testé pour python2)

    1. télécharger les sources de cx_freeze partir de pypi et l’extraire
    2. téléchargez cx_logging et extrayez-le dans le cx_freeze-4.3.4
    3. remplacer le fichier Win32Service.c dans cx_Freeze-4.3.4\source\bases avec ma version modifiée
    4. éditez la ligne 170 dans setup.py depuis if moduleInfo is not None and sys.version_info[:2] < (3, 0): to if moduleInfo is not None:
    5. exécuter python setup.py build dans le cx_freeze-4.3.4 (vous devez avoir MSC installé pour comstackr les fichiers source C)
    6. Copiez cx_Freeze-4.3.4\build\lib.win32-3.4\cx_Freeze\bases\Win32Service.exe dans C:\Python34\Lib\site-packages\cx_Freeze\bases (ou le chemin où votre python3 est installé)
    7. maintenant vous pouvez créer un exe gelé avec la base Win32Service (pas plus le cx_Freeze.freezer.ConfigError: no base named Win32Service erreur de cx_Freeze.freezer.ConfigError: no base named Win32Service )