Webページにアクセスできるようにしたいのですが、python関数が実行され、進行状況がWebページに表示されます。
そのため、Webページにアクセスすると、コマンドラインから実行したかのようにスクリプトの出力を確認できます。
ここの答えに基づいて
[〜#〜] python [〜#〜]からの出力を表示しようとしています
Markus Unterwaditzerのコードをpython関数で使用しようとしています。
import flask
import subprocess
app = flask.Flask(__name__)
def test():
print "Test"
@app.route('/yield')
def index():
def inner():
proc = subprocess.Popen(
test(),
Shell=True,
stdout=subprocess.PIPE
)
while proc.poll() is None:
yield proc.stdout.readline() + '<br/>\n'
return flask.Response(inner(), mimetype='text/html') # text/html is required for most browsers to show the partial page immediately
app.run(debug=True, port=5005)
実行されますが、ブラウザに何も表示されません。
こんにちは、テスト関数を呼び出したくないようですが、出力を提供する実際のコマンドラインプロセスです。また、proc.stdout.readlineなどからイテラブルを作成します。また、Pythonから忘れていたので、サブプロセスで必要なコードpythonコードをプルして、別のファイルに配置するだけです。
import flask
import subprocess
import time #You don't need this. Just included it so you can see the output stream.
app = flask.Flask(__name__)
@app.route('/yield')
def index():
def inner():
proc = subprocess.Popen(
['dmesg'], #call something with a lot of output so we can see it
Shell=True,
stdout=subprocess.PIPE
)
for line in iter(proc.stdout.readline,''):
time.sleep(1) # Don't need this just shows the text streaming
yield line.rstrip() + '<br/>\n'
return flask.Response(inner(), mimetype='text/html') # text/html is required for most browsers to show th$
app.run(debug=True, port=5000, Host='0.0.0.0')
これは、サブプロセスの出力をストリーミングし、同じテンプレートを使用して事後に静的にロードできるようにするソリューションです(サブプロセスが独自の出力をファイルに記録すると仮定します。そうでない場合は、プロセスの出力をログファイルに記録します)。読者のための演習として残されています)
from flask import Response, escape
from yourapp import app
from subprocess import Popen, PIPE, STDOUT
SENTINEL = '------------SPLIT----------HERE---------'
VALID_ACTIONS = ('what', 'ever')
def logview(logdata):
"""Render the template used for viewing logs."""
# Probably a lot of other parameters here; this is simplified
return render_template('logview.html', logdata=logdata)
def stream(first, generator, last):
"""Preprocess output prior to streaming."""
yield first
for line in generator:
yield escape(line.decode('utf-8')) # Don't let subproc break our HTML
yield last
@app.route('/subprocess/<action>', methods=['POST'])
def perform_action(action):
"""Call subprocess and stream output directly to clients."""
if action not in VALID_ACTIONS:
abort(400)
first, _, last = logview(SENTINEL).partition(SENTINEL)
path = '/path/to/your/script.py'
proc = Popen((path,), stdout=PIPE, stderr=STDOUT)
generator = stream(first, iter(proc.stdout.readline, b''), last)
return Response(generator, mimetype='text/html')
@app.route('/subprocess/<action>', methods=['GET'])
def show_log(action):
"""Show one full log."""
if action not in VALID_ACTIONS:
abort(400)
path = '/path/to/your/logfile'
with open(path, encoding='utf-8') as data:
return logview(logdata=data.read())
このようにして、コマンドの最初の実行時(POSTを介して)と、事後の保存されたログファイルの静的な提供時の両方で使用される一貫したテンプレートを取得します。