Django Subprocess批处理脚本中的stdout实时/无缓冲报告

时间:2010-11-19 04:17:00

标签: python django subprocess django-views mod-python

基本上背后的故事是我已经为客户建立了一个python脚本选择,以处理在其操作数据库和ecomms站点数据库之间导入和导出批处理作业。这很好用。这些脚本写入stdout以更新用户批处理脚本的状态。

我正在尝试为这些脚本生成一个框架,以便通过django视图运行,并将stdout发布到网页上,向用户显示这些批处理过程的进度。

该计划是为了 - 将批处理脚本作为子进程调用,然后将stdout和stderr保存到文件中。 - 将重定向返回到显示页面,该页面将每2秒重新加载一行并逐行显示正在写入stdout的文件的内容。

然而问题是,在整个批处理脚本运行完毕或错误输出之前,stdout / stderr文件实际上没有被写入。

我尝试过很多东西,但似乎都没有。

继承了当前的观看代码。

def long_running(app, filename):
    """where app is ['command', 'arg1', 'arg2'] and filename is the file used for output"""
    # where to write the result (something like /tmp/some-unique-id)
    fullname = temppath+filename
    f = file(fullname, "a+")
    # launch the script which outputs something slowly
    subprocess.Popen(app, stdout=f, stderr=f)# .communicate()
    # once the script is done, close the output
    f.close()

def attributeexport(request):
    filename = "%d_attribute" %(int(time.time())) #set the filename to be the current time stamp plus an identifier
    app = ['python','/home/windsor/django/applications/attribute_exports.py']
    #break thread for processing.
    threading.Thread(target=long_running, args=(app,filename)).start()
    return HttpResponseRedirect('/scripts/dynamic/'+filename+'/')
    pass

def dynamic(request, viewfile):
    fileobj = open(temppath+viewfile, 'r')
    results = []
    for line in fileobj:
        results.append(line)
        if '~END' in line:
            #if the process has completed
            return render_to_response('scripts/static.html', {'displaylist':results, 'filename':viewfile})
    return render_to_response('scripts/dynamic.html', {'displaylist':results, 'filename':viewfile})
pass

1 个答案:

答案 0 :(得分:1)

如果您使用以下内容会有所帮助:

['python','-u','path/to/python/script.py']