Подтвердить что ты не робот

Как постоянно отображать вывод Python на веб-странице?

Я хочу иметь возможность посещать веб-страницу, и она будет запускать функцию python и отображать прогресс на веб-странице.

Итак, при посещении веб-страницы вы можете увидеть вывод script, как если бы вы запустили его из командной строки.

Основываясь на ответе здесь

Как постоянно отображать вывод python на веб-странице?

Я пытаюсь отобразить вывод 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)

И он работает, но я ничего не вижу в браузере.

4b9b3361

Ответ 1

Привет, похоже, вы не хотите вызывать тестовую функцию, а фактический процесс командной строки, который обеспечивает вывод. Также создайте iterable из 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')

Ответ 2

Здесь вы найдете решение, которое позволяет вам транслировать вывод подпроцесса и загружать его статически после факта с использованием одного и того же шаблона (при условии, что ваш подпроцесс записывает его собственный вывод в файл, а если нет, то запись процесса выводится на файл журнала остается в качестве упражнения для читателя)

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), так и во время статической службы сохраненного файла журнала после факта.