簡體   English   中英

帶Flask的Windows服務僅在調試模式下運行。 普通模式似乎崩潰

[英]Windows service with Flask only run in DEBUG mode. Normal mode seem crash

我想將python腳本(使用Flask)安裝為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 Hello服務已啟動,然后停止了。某些服務會自動停止,如果它們未被其他服務或程序使用 ”。

我檢查了事件查看器日志,它顯示“實例的SvcRun()方法失敗。獲取回溯錯誤-traceback.print_exception()失敗%2:%3”

我正在Windows 10 64bit上使用Python 3.6.4,Flask 1.0.2,pywin32-224。

該腳本可以通過以下命令在DEBUG模式下工作: python myservice.py debug

希望有人可以幫助我

更新:我切換到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') 

我遇到了類似的問題,並通過在腳本頂部放置此行來解決此問題:

sys.stdout = sys.stderr = open(os.devnull, 'w')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM