Потоковая передача не работает во Flask + paramiko - PullRequest
1 голос
/ 01 июня 2019

У меня есть удаленный хост, на котором я запускаю турбостат через парамико (турбостат отображает температуру, мощность и загрузку ЦП за цикл).Stdout paramiko получает от удаленного хоста строку данных из турбостата в цикле.Я хочу отправить этот поток вывода на Flask, чтобы увидеть поток в Интернете, но теперь мой код получает в Интернете только одну строку

    app = Flask(__name__)
    apply_config(app, config)

  app.add_url_rule('/api/host/<comp>/turbostat', 'turbostat', turbostat)

    return app



def turbostat(comp):
    def inner():
        ip_addr = get_eine_ip_addr(comp)
        print(ip_addr)
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=ip_addr, username='root', password='1', port=22, timeout=20)
        sin, sout, serr = ssh.exec_command(""" turbostat -S | awk '{print "%Busy:"$2, "Bzy_MHz:"$3, "CoreTmp:"$10, "PkgWatt:"$16}' """)
        for line in line_buffered(sout):
            print(line)
            return line

    return flask.Response(inner(), mimetype='text/html')

def line_buffered(f):
    while not f.channel.exit_status_ready():
        yield str(f.readline())```

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Я нашел правильный путь:

def turbostat(comp):
    ip_addr = get_eine_ip_addr(comp)
    print(ip_addr)
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=ip_addr, username='root', password='1', port=22, timeout=20)
    sin, sout, serr = ssh.exec_command(""" turbostat -S | awk '{print "%Busy:"$2, "Bzy_MHz:"$3, "CoreTmp:"$10, "PkgWatt:"$16}' """)
    def line_buffered(f):
        while not f.channel.exit_status_ready():
            yield str(f.readline())

    return flask.Response(line_buffered(sout), mimetype='text/plain')
0 голосов
/ 03 июня 2019

Вы разрываете свой цикл в первой строке:

for line in line_buffered(sout):
    print(line)
    return line

Не уверен, что вы хотите, чтобы turbostat делал. Но если вы хотите распечатать полный вывод, просто выполните:

print(sout.read())

(а вам даже не нужно line_buffered).

...