gpt4 book ai didi

python - Django 子进程从批处理脚本实时/无缓冲地报告标准输出

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:26 25 4
gpt4 key购买 nike

基本上,背景故事是我为客户构建了一系列Python脚本,用于处理其操作数据库和ecomms站点数据库之间的导入和导出批处理作业。这很好用。这些脚本写入标准输出以更新用户批处理脚本的状态。

我正在尝试为这些脚本创建一个框架,以便通过 django View 运行,并将标准输出发布到网页以向用户显示这些批处理过程的进度。

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

但是问题是,直到整个批处理脚本完成运行或出错后,stdout/stderr 文件才会被实际写入。

我尝试了很多方法,但似乎都不起作用。

这是当前 View 代码。

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

最佳答案

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

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

关于python - Django 子进程从批处理脚本实时/无缓冲地报告标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4222035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com