获取命令行脚本的输出作为模板变量

时间:2014-11-06 10:25:19

标签: python django

我是django的新手,我需要帮助。

我有一个正在运行的应用程序(遗留),我正在尝试在开发机器中添加一个新页面以运行一些脚本,这样设计人员就不必进行ssh登录。

我希望它运行脚本并将其输出返回到html页面,所以我已经这样做了:

url.py:

url(r'^DEVUpdate', 'myviewa.views.devUpdate'),

在视图中:

def devUpdate(request):
    response = os.popen('./update.sh').read()
    print response
    return render_to_response('aux/update.html', locals(), context_instance=RequestContext(request));

在html中:

Response:
{{ response }}

进入DEVUpdate页面时的输出是在我的机器中:

sh: 1: ./update.sh: not found

但在html中:

Response:

如何在html中获取响应值?

PD:我想在html页面中看到“sh:1:./ update.sh:not found”消息

2 个答案:

答案 0 :(得分:1)

os.popen返回stdout上命令的输出。像这样的错误消息会发送给stderr,所以你不会得到它。

此外,os.popen已被弃用,正如the docs所述。相反,请使用subprocess.check_output

import subprocess

try:
    # stderr=subprocess.STDOUT combines stdout and stderr
    # shell=True is needed to let the shell search for the file
    # and give an error message, otherwise Python does it and
    # raises OSError if it doesn't exist.
    response = subprocess.check_output(
        "./update.sh", stderr=subprocess.STDOUT,
        shell=True)
except subprocess.CalledProcessError as e:
    # It returned an error status
    response = e.output

最后,如果update.sh花费的时间超过几秒钟,那么它可能应该是Celery调用的后台任务。现在整个命令必须在Django给出响应之前完成。但那与问题无关。

答案 1 :(得分:0)

您需要在上下文中传递响应:

return render_to_response('aux/update.html', locals(), context_instance=RequestContext(request, {'response': response});

现在您尝试从模板访问响应,但不在上下文中传递它