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

2024-05-13 21:57:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个远程主机,通过paramiko运行涡轮增压器(涡轮增压器在一个周期内显示温度、功率和CPU负载)。Stdout paramiko从远程主机接收来自turbostat的循环数据字符串。 我想将这个输出流发送到Flask以查看web上的流,但是现在我的代码在web上只接收一个字符串

    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())```

Tags: 字符串ipappparamikoreturn远程defline
2条回答

你在第一行打破了循环:

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:"$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')

相关问题 更多 >