"Return" stdout 到浏览器而不退出 Flask 中的任何函数

"Return" stdout to browser without exiting from any function in Flask

我正在混合使用 Python Flask(触发流程)和 Fabric(在远程机器上自动执行任务)。

我尝试使用 yield 关键字并成功地在 Flask 中成功地显示了示例程序的输出,但没有 Fabric。

#!/usr/bin/env python

from flask import Flask, render_template, redirect, url_for, Response
import pexpect
import sys

app = Flask(__name__)

@app.route('/getdata')
def getdata():
    def meh():
        child = pexpect.spawn('/bin/bash')
        child.sendline('mysh.sh')
        child.expect(pexpect.EOF)
        child.expect(' press [Enter]')
        child.interact()
        child.expect(pexpect.EOF)

        for line in iter(sys.stdout.readline,''):
            yield line.rstrip() + '\n'

    return Response(meh(), mimetype='text/html')


if __name__ == "__main__":
    app.run()

有人可以指出我应该寻求完成这项工作的方向吗?以便每个结构 运行(命令) 的标准输出在 运行 时间内显示到浏览器。

好的,如果你的意思是 'realtime' 而不仅仅是 运行 时间,你可能想要多看看你的框架,如果你想要数据 return ed 实时(就像在构建工具中一样)。

为此,您可以 运行 将结构作为单独的异步任务(使用一些框架,如芹菜等),并将结构中的结果转储回队列/管道/数据库/其他任何东西。然后让您的原始线程 return 来自重复请求或重复队列。


但是,如果只从你的数据中调用 fabric,fabric(或者如果你真的想要,Paramiko(它是 fabric 环绕的 hte 库))可以从你的代码中调用,即不使用 shell 调用 fab foo.

当调用 运行() 时,您可以检索 运行 命令的 std out/std err 的输出...Paramiko 的文档较少(其中这就是 fabric 使用起来如此棒的原因),但是如果你看看这个博客: http://jessenoller.com/blog/2009/02/05/ssh-programming-with-paramiko-completely-different 这包含一堆信息:

基本上,那里的例子是:

ssh.connect('127.0.0.1', username='jesse', password='lol')
stdin, stdout, stderr = ssh.exec_command("uptime")

x = stdout.readlines()

x 值 --> ['13:35 up 11 days, 3:13, 4 users, load averages: 0.14 0.18 0.16\n']

添加到你的烧瓶中是微不足道的,但它不会实时,即你的烧瓶和服务器将缓冲它,return整个假设浏览器没有超时,在进程结束时发送给浏览器的批次。

希望对您有所帮助。