Я разработал приложение для колб, которое запускает скрипт математической оптимизации (PuLP
+ Python) для ввода данных пользователем.Так как вычисления занимают довольно много времени, я хочу постоянно (без обновления) отображать операторы печати оптимизатора на своей веб-странице.
На основе этого решения Мне удалось запустить subprocess
смой .py
скрипт.В этом сценарии оператор print()
делает то, что должен, однако я вижу только выходные данные в командной строке.С помощью flash()
мне удалось отобразить вывод, но он отображается только после того, как вычисление завершено и страница перезагружена.Я пытаюсь вывести операторы print()
в реальном времени в моем HTML.Есть ли способ достичь этого?
Спасибо!
Выдержка из routes.py
:
@app.route('/optimize', methods=['GET', 'POST'])
def solve():
path = os.path.join(app.root_path, 'optimization', 'assets')
file = "test.py"
execute(file, path)
return redirect(url_for('home'))
Функция execute(file,path)
:
import os
import subprocess as sub
def execute(command, directory):
# change directory to execute the command
os.chdir(directory)
proc = sub.Popen(['python','-u', command], stdout=sub.PIPE, universal_newlines=True) # Python 2: bufsize=1
for stdout_line in proc.stdout:
print(stdout_line.rstrip() + '\n')
flash(stdout_line.rstrip(), 'python_print')
proc.stdout.close()
return_code = proc.wait()
if return_code:
raise sub.CalledProcessError(return_code, command)
И, наконец, мой HTML
, который отображается в маршруте home
:
{% with prints = get_flashed_messages(category_filter=["python_print"]) %}
{% if prints %}
<div class="content-section">
<h3>Solver Status</h3>
<ul>
{%- for message in prints %}
<li>{{ message }}</li>
{% endfor -%}
</ul>
</div>
{% endif %}
{% endwith %}