失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python 打包成exe 1053_Python Windows服务pyinstaller可执行文件错误1053

python 打包成exe 1053_Python Windows服务pyinstaller可执行文件错误1053

时间:2023-02-16 10:27:49

相关推荐

python 打包成exe 1053_Python Windows服务pyinstaller可执行文件错误1053

我在

python中编写了一个

Windows服务.如果我从命令提示符运行我的脚本

python runService.py

当我这样做时,服务安装并正确启动.我一直在尝试使用pyinstaller创建一个可执行文件,因为我看到与py2exe相同的问题.当我运行.exe服务安装,但不启动,我得到以下错误

error 1053 the service did not respond to the start or control request in a timely fashion

我看到很多人都有这个问题,但我似乎找不到如何解决这个问题的确切答案.

winservice.py

from os.path import splitext, abspath

from sys import modules, executable

from time import *

import win32serviceutil

import win32service

import win32event

import win32api

class Service(win32serviceutil.ServiceFramework):

_svc_name_ = '_unNamed'

_svc_display_name_ = '_Service Template'

_svc_description_ = '_Description template'

def __init__(self, *args):

win32serviceutil.ServiceFramework.__init__(self, *args)

self.log('init')

self.stop_event = win32event.CreateEvent(None, 0, 0, None)

#logs into the system event log

def log(self, msg):

import servicemanager

servicemanager.LogInfoMsg(str(msg))

def sleep(self, minute):

win32api.Sleep((minute*1000), True)

def SvcDoRun(self):

self.ReportServiceStatus(win32service.SERVICE_START_PENDING)

try:

self.ReportServiceStatus(win32service.SERVICE_RUNNING)

self.log('start')

self.start()

self.log('wait')

win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)

self.log('done')

except Exception, x:

self.log('Exception : %s' % x)

self.SvcStop()

def SvcStop(self):

self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)

#self.log('stopping')

self.stop()

#self.log('stopped')

win32event.SetEvent(self.stop_event)

self.ReportServiceStatus(win32service.SERVICE_STOPPED)

# to be overridden

def start(self): pass

# to be overridden

def stop(self): pass

def instart(cls, name, description, display_name=None, stay_alive=True):

''' Install and Start (auto) a Service

cls : the class (derived from Service) that implement the Service

name : Service name

display_name : the name displayed in the service manager

decription: the description

stay_alive : Service will stop on logout if False

'''

cls._svc_name_ = name

cls._svc_display_name_ = display_name or name

cls._svc_desciption_ = description

try:

module_path=modules[cls.__module__].__file__

except AttributeError:

module_path=executable

module_file = splitext(abspath(module_path))[0]

cls._svc_reg_class_ = '%s.%s' % (module_file, cls.__name__)

if stay_alive: win32api.SetConsoleCtrlHandler(lambda x: True, True)

try:

win32serviceutil.InstallService(

cls._svc_reg_class_,

cls._svc_name_,

cls._svc_display_name_,

startType = win32service.SERVICE_AUTO_START,

description = cls._svc_desciption_

)

print 'Install ok'

win32serviceutil.StartService(

cls._svc_name_

)

print 'Start ok'

except Exception, x:

print str(x)

UPDATE

我通过使用py2exe解决了这个问题,但同样的改变也可能适用于pyinstaller.我没有时间自己检查.

我不得不删除instart功能.以下是我的winservice.py如何读取.

winservice_py2exe.py

from os.path import splitext, abspath

from sys import modules, executable

from time import *

import win32serviceutil

import win32service

import win32event

import win32api

class Service(win32serviceutil.ServiceFramework):

_svc_name_ = 'actualServiceName' #here is now the name you would input as an arg for instart

_svc_display_name_ = 'actualDisplayName' #arg for instart

_svc_description_ = 'actualDescription'# arg from instart

def __init__(self, *args):

win32serviceutil.ServiceFramework.__init__(self, *args)

self.log('init')

self.stop_event = win32event.CreateEvent(None, 0, 0, None)

#logs into the system event log

def log(self, msg):

import servicemanager

servicemanager.LogInfoMsg(str(msg))

def sleep(self, minute):

win32api.Sleep((minute*1000), True)

def SvcDoRun(self):

self.ReportServiceStatus(win32service.SERVICE_START_PENDING)

try:

self.ReportServiceStatus(win32service.SERVICE_RUNNING)

self.log('start')

self.start()

self.log('wait')

win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)

self.log('done')

except Exception, x:

self.log('Exception : %s' % x)

self.SvcStop()

def SvcStop(self):

self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)

#self.log('stopping')

self.stop()

#self.log('stopped')

win32event.SetEvent(self.stop_event)

self.ReportServiceStatus(win32service.SERVICE_STOPPED)

# to be overridden

def start(self): pass

# to be overridden

def stop(self): pass

if __name__ == '__main__':

# Note that this code will not be run in the 'frozen' exe-file!!!

win32serviceutil.HandleCommandLine(VidiagService) #added from example included with py2exe

以下是我与py2exe一起使用的setup.py文件.这是从py2exe安装中包含的示例中获取的:

setup.py

from distutils.core import setup

import py2exe

import sys

if len(sys.argv) == 1:

sys.argv.append("py2exe")

sys.argv.append("-q")

class Target:

def __init__(self, **kw):

self.__dict__.update(kw)

# for the versioninfo resources

self.version = "0.5.0"

pany_name = "No Company"

self.copyright = "no copyright"

self.name = "py2exe sample files"

myservice = Target(

# used for the versioninfo resource

description = "A sample Windows NT service",

# what to build. For a service, the module name (not the

# filename) must be specified!

modules = ["winservice_py2exe"]

)

setup(

options = {"py2exe": {"typelibs":

# typelib for WMI

[('{565783C6-CB41-11D1-8B02-00600806D9B6}', 0, 1, 2)],

# create a compressed zip archive

"compressed": 1,

"optimize": 2}},

# The lib directory contains everything except the executables and the python dll.

# Can include a subdirectory name.

zipfile = "lib/shared.zip",

service = [myservice]

)

一旦您创建了exe,您可以使用以下命令从命令安装服务

winservice_py2exe.exe -install

然后启动您可以使用的服务:

net start aTest

或从Windows服务管理器.所有其他Windows命令行功能现在可以在服务以及Windows服务管理器上工作.

如果觉得《python 打包成exe 1053_Python Windows服务pyinstaller可执行文件错误1053》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。