Python 3 исполняемый как служба Windows

Я пытаюсь написать Windows Service в python, но сложной частью является то, что я хочу развернуть его на машине, на которой нет python. Я успешно создал такой сервис, и он работает, если я запускаю с моей машины. проблема начинается, когда я пытаюсь преобразовать ее в exe, а затем попытаюсь установить ее. сначала я попытался использовать пример службы cx_freeze (см. здесь ), setup.py выглядит так:

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 ) 

и config.py:

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

но когда я пытаюсь его построить (сборка python setup.py), я получаю сообщение об ошибке: «cx_Freeze.freezer.ConfigError: без базы Win32Service»

Во-вторых, я попытался использовать обычную установку cx_freeze, exe i get устанавливает сервис отлично, но как только я попытаюсь запустить его, я получаю сообщение об ошибке: «Ошибка 1053: служба не отвечала на запуск или запрос управления своевременно»

setup.py – python 3.3 regualr exe, устанавливает службу, но при попытке ее запуска отправляет сообщение об ошибке:

 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) 

наконец, мне удалось заставить его работать в python 2.7 с помощью py2exe, но py2exe недоступен для python 3.3, а я мой код в 3.3

Я думаю, проблема в конфигурации setup.py im используется с cx_freeze. есть идеи ??

мой 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 с использованием py2exe, который работает: (взято отсюда )

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

Спасибо, Амит

    Похоже, что Win32Service был обновлен поддержкой Python 3.x в рамках проекта cx_Freeze в результате этого потока . У этого пользователя изначально была та же проблема, о которой вы сообщали, поэтому я предполагаю, что это также решит вашу проблему.

    Основываясь на сообщенной ошибке, это вызвано тем, что _GetBaseFileName () внутри Freezer.py не находит скомпилированный Win32Service.exe. Этот исполняемый файл должен быть создан при создании / установке cx_Freeze.

    Если это не так много, попробуйте найти установленный каталог установки cx_Freeze для «Win32Service.exe» и подтвердить, что он существует. Надеюсь, это приблизит вас на один шаг.

    Я редактировал Win32Service.c в cx_freeze src для поддержки python3

    Отредактировал его с некоторыми командами препроцессора, для поддержки python2 (но еще не проверен для python2)

    1. скачать источники cx_freeze из pypi и извлечь его
    2. загрузите cx_logging и извлеките его в cx_freeze-4.3.4
    3. замените файл Win32Service.c в cx_Freeze-4.3.4\source\bases с моей отредактированной версией
    4. отредактируйте строку 170 в if moduleInfo is not None and sys.version_info[:2] < (3, 0): setup.py if moduleInfo is not None and sys.version_info[:2] < (3, 0): if moduleInfo is not None:
    5. запустите python setup.py build в cx_freeze-4.3.4 (у вас должен быть установлен MSC для компиляции исходных файлов C)
    6. скопируйте cx_Freeze-4.3.4\build\lib.win32-3.4\cx_Freeze\bases\Win32Service.exe в C:\Python34\Lib\site-packages\cx_Freeze\bases (или путь, где установлен ваш python3)
    7. теперь вы можете создать замороженный exe с базой Win32Service (не больше cx_Freeze.freezer.ConfigError: no base named Win32Service )

    tldr Python 3.5 Создание службы Windows с помощью pyinstaller: gist

    Здесь простая служба Windows с 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) 

    Создайте exe с помощью pyinstaller ( pip install pyinstaller ) и python 3.5:

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

    Установка и запуск службы

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

    Проверьте файл C:\\TestService.log .

    Остановить и очистить

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