“返回”标准输出到浏览器,而不退出Flas中的任何功能

2024-09-25 16:26:00 发布

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

我使用了Python-Flask(触发进程)和Fabric(在远程机器上自动执行任务)。在

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

#!/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()

有人能给我指点方向吗?以便在运行时向浏览器显示每个结构运行(命令)的stdout。在


Tags: nameimportchildappflaskforbinresponse
1条回答
网友
1楼 · 发布于 2024-09-25 16:26:00

好吧,如果你的意思是“实时”而不仅仅是运行时,你可能想做的是多看看你的框架,如果你想实时返回数据(就像在构建工具中一样)。在

为此,您可以将fabric作为一个单独的异步任务运行(使用一些框架,如celery等),并将fabric中的结果转储回队列/管道/数据库/任何东西。然后使用repeat请求或repeat队列从该线程返回原始线程。在


然而,要从数据中调用fabric,fabric(或者如果您真的想,Paramiko(fabric包装的hte库)可以从代码中调用,也就是说,不使用shell调用fab foo。在

调用run()时,可以检索正在运行的命令的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向上11天,3:13,4个用户,平均负载:0.14 0.18 0.16\n']

这对于添加到您的flask来说很简单,但不会是realtime,也就是说,您的flask和服务器将缓冲它,并在进程结束时将整个批返回给浏览器,假设浏览器没有超时。在

希望有帮助。在

相关问题 更多 >