我目前有一个Python文件,当使用python file_name.py运行时,会安装一个Windows服务,该服务可以在事件查看器中查看应用程序日志,并可使用sc stop service_name停止。然而,当使用cx_Freeze转换为可执行文件时,可执行文件运行时没有错误,但是该服务不再安装。这种情况发生在我仅运行可执行文件本身、运行service_name.exe --install service_name或运行sc create service_name binPath=service_path时。
我的setup.py文件大致如下:
from cx_Freeze import setup, Executable
options = {
'build_exe': {
'packages': ['packagename'],
'includes': ['ServiceHandler', 'cx_Logging']}
}
setup(name='cx_FreezeSampleService',
version='0.1',
description='Sample cx_Freeze Windows serice',
executables=Executable('Config.py', base='Win32Service',
targetName='cx_FreezeSampleService.exe'),
options=options
)
我的Config.py文件大致如下:
NAME = 'cx_FreezeSampleService%s'
DISPLAY_NAME = 'cx_Freeze Sample Service - %s'
MODULE_NAME = 'ServiceHandler'
CLASS_NAME = 'Handler'
DESCRIPTION = 'Sample service description'
AUTO_START = True
SESSION_CHANGES = False
最后,我的ServiceHandler.py文件看起来大致如下:
class Handler(object):
def Initialize(self, Config):
pass
def Run(self):
#code to run service
def Stop(self):
#code to stop service
这段代码参考了cx_Freeze官方源码中的示例(https://bitbucket.org/anthony_tuininga/cx_freeze/src/1282b6b6ee637738210113dd88c3c198d475340f/cx_Freeze/samples/service/?at=default),但是这段代码和示例看起来似乎都不能实际安装服务。感谢您的帮助!
initialize,run,stop
必须用小写字母定义。例如,服务本身是通过cx_FreezeSampleService.exe --install test
进行注册的。 - Martin Vyskočil