流式处理在 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')
我有一个远程主机,我在上面通过 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')