実現したいこと
現在Pythonの勉強を進めており、Flaskアプリケーションの作成を試しているところです。
個別にスクリプトファイルをダブルクリックして起動するアプリは作れたので、次の段階として
「Windowsサービスで起動できるようにしたい」と考えています。
- Flaskアプリケーション(Python製)をWindowsサービスから起動できるようにする
前提
Windows10 21H2
Python 3.11
pipで各種Libをインポート
発生している問題・エラーメッセージ
エラーメッセージなどは特に出ていない(あるいは出せていない)
呼び出し先Flaskアプリケーションが起動できていればアクセスできるページへアクセスできない
(サーバが起動できていないときのような「接続拒否」のエラーとなる)
該当のソースコード
service.py
1import win32serviceutil 2import sys 3import servicemanager 4import subprocess 5 6class SampleService(win32serviceutil.ServiceFramework): 7 _svc_name_ = 'SampleService' 8 _svc_display_name_ = 'Sample Service' 9 _svc_description_ = 'This is Sample service.' 10 11 def SvcDoRun(self): 12 self.run = True 13 while self.run: 14 # Write datetime.now() every second 15 import time, datetime 16 time.sleep(1) 17 open(r'C:\pleiades\2022-12\workspace\HelloService\logs\test.txt', 'a').write('%s\n' % datetime.datetime.now()) 18 proc = subprocess.Popen('C:\pleiades\2022-12\workspace\HelloService\flaskApp.py',shell=True,stdout=subprocess.PIPE) 19 open(r'C:\pleiades\2022-12\workspace\HelloService\logs\test.txt', 'a').write('%s\n' % str(proc.stdout)) 20 open(r'C:\pleiades\2022-12\workspace\HelloService\logs\test.txt', 'a').write('Processing>%s\n' % datetime.datetime.now()) 21 killcmd = 'taskkill /F /PID {pid} /T'.format(pid=proc.pid) 22 subprocess.run(killcmd,shell=True) 23 open(r'C:\pleiades\2022-12\workspace\HelloService\logs\test.txt', 'a').write('Stop>%s\n' % datetime.datetime.now()) 24 25 def SvcStop(self): 26 self.run = False 27 28#if __name__ == '__main__': 29# win32serviceutil.HandleCommandLine(SampleService) 30if __name__ == '__main__': 31 if len(sys.argv) == 1: 32 servicemanager.Initialize() 33 servicemanager.PrepareToHostSingle(SampleService) 34 servicemanager.StartServiceCtrlDispatcher() 35 else: 36 win32serviceutil.HandleCommandLine(SampleService)
flaskApp.py
1from flask import Flask,request,session, abort, redirect 2from datetime import timedelta 3import configparser 4import logging 5from logging import StreamHandler, FileHandler, Formatter 6from logging import INFO, DEBUG, NOTSET 7import os 8from datetime import datetime 9from flask.templating import render_template 10import base64 11import json 12 13from waitress import serve 14 15#Flaskクラスをインスタンス化する 16app = Flask(__name__) 17 18 19#URLと実行する関数をマッピングする 20#ルートへのアクセス時 21@app.route("/" , methods=["GET"]) 22def index(): 23 24 return render_template("toppage.html") 25 26#起動時のみの処理(簡易サーバ起動) 27if __name__ == '__main__': 28 logger = logging.getLogger(__name__) 29 #簡易サーバ起動(デバッグ中はこちらを有効化) 30 app.run(port='8081', debug=True
試したこと
上記のservice.pyの18行目について、runとPopenを変えてみる、指定方法を相対パス・絶対パスに変えてみるなどを
試してみました。
また、Popenのstdoutの内容をログに出そうとしてみましたが、今の時点でうまくいっていません(こちらはもう少し試してみたいこともあります)。
基本的なところで知識などの抜けがある可能性もある気がしており、「こういうことを確かめてみたか」というご指摘でもありがたいです。
また、最終的にやりたいことが「Pythonで書いたFlaskアプリをWindowsサービスで起動し、ログインユーザがログアウトした状態でも稼働できるようにしたい」というものなので、そもそものアプローチが間違っている場合、アプローチのヒントをいただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/08/20 09:03