基本上背后的故事是我已经为客户建立了一个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
答案 0 :(得分:1)
如果您使用以下内容会有所帮助:
['python','-u','path/to/python/script.py']