与瓶Windows服务仅在调试模式下运行。普通模式似乎崩溃

问题描述 投票:0回答:1

我想安装Python脚本(使用瓶)作为Windows服务。我用简单的代码如下(以myservice.py):

import win32serviceutil
import win32service
import win32event
import win32evtlogutil
import servicemanager
import socket
import time
import logging
from multiprocessing import Process
import traceback
import logging
from datetime import datetime,tzinfo,timedelta
from flask import Flask
import os
import sys
sys.path.append(os.path.dirname(__name__))

app = Flask(__name__)

class Zone(tzinfo):
    def __init__(self,offset,isdst,name):
        self.offset = offset
        self.isdst = isdst
        self.name = name
    def utcoffset(self, dt):
        return timedelta(hours=self.offset) + self.dst(dt)
    def dst(self, dt):
            return timedelta(hours=1) if self.isdst else timedelta(0)
    def tzname(self,dt):
         return self.name

@app.route('/')
def hello_world():
    logging.info('[GET] hello_world ...')
    KST = Zone(+9,False,'KST')
    now_time = datetime.now(KST).strftime('%Y-%m-%d %H:%M:%S %Z')
    return 'Hello, World! ' + now_time

logging.basicConfig(
    filename = 'c:\\Temp\\hello-service.log',
    level = logging.DEBUG, 
    format = '[helloflask] %(levelname)-7.7s %(message)s'
)

class HelloFlaskSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "AIHello"
    _svc_display_name_ = "AI Hello"

    def __init__(self, *args):
        win32serviceutil.ServiceFramework.__init__(self, *args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        #socket.setdefaulttimeout(5)
        self.stop_requested = False

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        #self.process.terminate()
        win32event.SetEvent(self.hWaitStop)
        self.ReportServiceStatus(win32service.SERVICE_STOPPED)
        logging.info('Stopped service ...')
        self.stop_requested = True

    def SvcDoRun(self):
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_,'')
        )
        logging.info('Before main')

        app.run()

if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(HelloFlaskSvc)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(HelloFlaskSvc)

我可以通过命令来安装这个脚本:python.exe myservice.py -install,它显示在服务列表中,但是当我尝试启动它说:“本地计算机上的AI你好服务启动,然后自动停止,如果某些服务站。他们不是由其他服务或程序使用”。

我检查事件查看器日志,它显示“实例的SvcRun()方法失败.Error越来越回溯 - traceback.print_exception()失败%2:%3”

我使用的Windows 10 64位的Python 3.6.4,1.0.2瓶,pywin32-224。

蟒蛇myservice.py调试:此脚本可以在调试模式下的命令工作

希望有人能帮助我,请

更新:我转向Python 2.7。它显示了同样的错误。但是,在事件查看器日志:

The instance's SvcRun() method failed 
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\win32\lib\win32serviceutil.py", line 839, in SvcRun
    self.SvcDoRun()
  File "D:\MusFatAI\FlaskServiceWin32-master\FlaskServiceWin32-master\win32_service.py", line 73, in SvcDoRun
    app.run(debug=False)
  File "C:\Python27\lib\site-packages\flask\app.py", line 938, in run
    cli.show_server_banner(self.env, self.debug, self.name, False)
  File "C:\Python27\lib\site-packages\flask\cli.py", line 629, in show_server_banner
    click.echo(message)
  File "C:\Python27\lib\site-packages\click\utils.py", line 261, in echo
    file.flush()
IOError: (9, 'Bad file descriptor') 
python flask service window
1个回答
0
投票

我有类似的问题,我放上这行的脚本的顶部固定它:

sys.stdout = sys.stderr = open(os.devnull, 'w')
© www.soinside.com 2019 - 2024. All rights reserved.