gpt4 book ai didi

Python 3 可执行文件作为 Windows 服务

转载 作者:太空狗 更新时间:2023-10-29 18:29:42 26 4
gpt4 key购买 nike

我正在尝试用 python 编写 Windows 服务,但棘手的部分是我想将它部署在没有 python 的机器上。我已经成功创建了类似 this 的服务,如果我从我的机器上运行它就可以工作。当我尝试将其转换为 exe 然后尝试安装时,问题就开始了。首先,我尝试使用 cx_freeze 服务示例(参见 here),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 build)我得到一个错误:“cx_Freeze.freezer.ConfigError:没有名为 Win32Service 的基”

其次,我尝试使用常规的 cx_freeze 安装程序,我得到的 exe 可以很好地安装服务,但是一旦我尝试启动它,我就会收到错误消息:“错误 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)

最后,我设法使用 py2exe 让它在 python 2.7 中工作,但是 py2exe 不适用于 python 3.3,我的代码在 3.3 中

我想问题出在与 cx_freeze 一起使用的 setup.py im 的配置中。有什么想法吗??

我的服务处理器:

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,使用 py2exe 的 python 2.7 有效:(取自 here)

from distutils.core import setup
import py2exe

setup( service = ["ServiceHandler"],
description = "SERVICE TEST",
modules = ["GSR_test"],
cmdline_style='pywin32', )

谢谢,阿米特

最佳答案

tldr 使用 pyinstaller 构建 Python 3.5 Windows 服务:gist

这里是一个简单的 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)

使用 pyinstaller(pip install pyinstaller)和 python 3.5 创建一个 exe:

(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

关于Python 3 可执行文件作为 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com