流在Flask + paramiko中不起作用

时间:2019-06-01 18:30:11

标签: python flask paramiko

我有一个远程主机,我在该主机上通过paramiko运行一个涡轮增压器(涡轮增压器周期性地显示温度,功率和负载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:"$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 :(得分:0)

您在第一行中断了循环:

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

不确定turbostat要做什么。但是,如果要打印完整的输出,只需执行以下操作:

print(sout.read())

(而且您甚至不需要line_buffered)。

答案 1 :(得分:0)

我找到了正确的方法:

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')