我正在混合使用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()
有人能指出我应该想要完成的方向吗?这样每个结构运行(命令)的标准输出都会在运行时显示给浏览器。
答案 0 :(得分:1)
好吧,如果你的意思是'实时'而不仅仅是运行时间,你可能想做的就是在你的框架上看一点,如果你想要实时返回数据(就像在构建工具中一样)等)。
为此,您可以将结构作为单独的异步任务运行(使用像celery等一些框架),并将结果从结构转储回队列/管道/数据库/等等。然后让原始线程从重复请求或重复队列返回。
然而,只需从您的数据,结构(或者如果您真的想要)调用结构,可以从您的代码中调用Paramiko(它是结构所包含的库)),即不使用shell来调用{{ 1}}。
当调用run()时,你可以检索正在运行的命令的std out / std err的输出...... Paramiko的文档记录不太清楚(这就是为什么使用Fabric非常棒),但如果你看看这个博客: http://jessenoller.com/blog/2009/02/05/ssh-programming-with-paramiko-completely-different这包含大量信息:
基本上,那里的例子是:
fab foo
x的值 - > ['13:35上11天,3:13,4位用户,平均负载:0.14 0.18 0.16 \ n']
添加到烧瓶中这将是微不足道的,但它不会实时,即烧瓶和服务器将缓冲它,并在过程结束时将整批产品返回到浏览器,假设浏览器没有超时。
希望有所帮助。