Служба Windows с Flask работает только в режиме отладки.Нормальный режим кажется сбой - PullRequest
0 голосов
/ 08 октября 2018

Я хочу установить скрипт 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 - ошибка traceback.print_exception ()% 2:% 3"

Я используюPython 3.6.4, Flask 1.0.2, pywin32-224, в Windows 10 64bit.

Этот сценарий может работать в режиме отладки по команде: 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') 

1 Ответ

0 голосов
/ 03 февраля 2019

У меня была похожая проблема, и я исправил ее, поместив строку поверх сценария:

sys.stdout = sys.stderr = open(os.devnull, 'w')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...