流式处理在 Flask + paramiko 中不起作用

Streaming does not work in Flask + paramiko

我有一个远程主机,我在上面通过 paramiko 运行 一个 turbostat(一个 turbostat 在一个周期内显示温度、功率和负载 CPU)。 Stdout paramiko 循环从远程主机接收来自 turbostat 的数据字符串。 我想将此输出流发送到 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:", "Bzy_MHz:", "CoreTmp:", "PkgWatt:"}' """)
        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())```

您在第一行打破了循环:

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

不确定您希望 turbostat 做什么。但是如果你想打印一个完整的输出,就这样做:

print(sout.read())

(你甚至不需要 line_buffered)。

我找到了正确的方法:

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:", "Bzy_MHz:", "CoreTmp:", "PkgWatt:"}' """)
    def line_buffered(f):
        while not f.channel.exit_status_ready():
            yield str(f.readline())

    return flask.Response(line_buffered(sout), mimetype='text/plain')