Пробелы и столбцы в выводе команды не сохраняются в ответе колбы - PullRequest
1 голос
/ 01 мая 2019

Вот моя простая конечная точка API колбы:

 # -*- coding: utf-8 -*-

 from flask import Flask, render_template
 from subprocess import PIPE, Popen

 app = Flask(__name__)

 @app.route('/', methods=['GET'])
 def main():
     cmd = Popen(['vmstat', '-a', '-w'], stdout=PIPE, stderr=PIPE)
     output, err = cmd.communicate()
     output = output.splitlines()
     return render_template('stats_template.html', output=output)

 if __name__ == '__main__': 
     app.run(port=54321, host='0.0.0.0')

Шаблон выглядит так:

 <ul>
  {% for l in output %}
    <p>{{ l }}</p>
  {% endfor %}
 </ul>

Программа работает нормально, однако разрывы строк, столбцы не сохраняются, а выходные данные в браузере читаются не так:

b'procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------'

b' r b swpd free inact active si so bi bo in cs us sy id wa st'

b' 1 0 13068 1599088 560976 790220 0 0 36 73 139 597 21 41 38 0 0'

Пытались избавиться от b' вместе с выводом, точно таким же, как в оболочке linux.

Ценю любое понимание.

Edit1: Добавление вывода vmstat в качестве ссылки. Как видите, ответ от колбы не сохранил пробелы и столбцы.

$ vmstat -a -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free        inact       active   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0        13068      1611488       563132       776448    0    0    35    73  159  693  21  42  37   0   0

1 Ответ

0 голосов
/ 27 мая 2019

Требуется html <pre> тег в шаблоне jinja2 для получения ожидаемого результата.

Окончательный шаблон:

<code><div>
  <ul>
    {% for line in output %}
      <pre>{{ line }}
{% endfor%}

Финальный фрагмент колбы:

# -*- coding: utf-8 -*-

from flask import Flask, render_template
from subprocess import PIPE, Popen

application = Flask(__name__)

@application.route('/', methods=['GET'])
def vmstat():
    cmd = Popen(['/usr/bin/vmstat', '-a', '-w'], shell = False, stdout=PIPE, stderr=PIPE)
    output, err = cmd.communicate()
    output = str(output, 'utf-8').splitlines()
    return render_template('stats_template.html', output=output)

if __name__ == '__main__':
    application.run(port=54321, host='0.0.0.0')

И браузер показывает:

procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free        inact       active   si   so    bi    bo   in   cs  us  sy  id  wa  st
 0  0            0     14368716       639576       955400    0    0     8     1    1    1   0   0 100   0   0
...