在 Python 中使用 flush() 后清除 stdout

3
我将尝试让我的Python脚本在输出时即时地流到网页上。因此,在我的Javascript中,我这样做:
var xmlhttp;
var newbody = "";
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==3) {
      newbody = newbody + xmlhttp.responseText;
      document.getElementById("new").innerHTML=newbody;
    }
}
xmlhttp.open("GET","http://localhost/cgi-bin/temp.py",true);
xmlhttp.send();

在我的Python脚本中,我有以下代码:

print "Content-Type: text/plain"
print ""
print " " * 5000   # garbage data for safari/chrome
sys.stdout.flush()

for i in range(0,5):
    time.sleep(.1)
    sys.stdout.write("%i " % i)
    sys.stdout.flush()

现在我期望的是0 1 2 3 4,但实际上得到的是0 0 1 0 1 2 0 1 2 3 0 1 2 3 4

每次似乎发送整个缓冲区,而我真正想要的是每个 onreadystatechange 只发送一个数字。

我做错了什么?


你尝试过在循环内不加上 sys.stdout.flush() 运行它吗?如果尝试过,结果是什么? - brandizzi
@brandizzi 如果我不运行stdout.flush(),输出是正确的,但实际上它并没有流式传输数据。它只是等待程序完成。 - Jeff
1个回答

3

xmlhttp.responseText 在客户端始终包含整个响应,因此不需要使用 newbody,只需使用 xmlhttp.responseText


Tamas,我知道,这就是问题所在。我该如何使xmlhttp.responseText仅包含新部分? - Jeff
抱歉,我有点误解了你的回答,尽管问题仍然存在。但是你所说的是这是一个JavaScript问题而不是Python问题,这很有启发性。 - Jeff
你不能这样做,因为responseText应该是这样工作的 - 它必须始终包含到目前为止收到的整个响应。(请参见http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/#dfn-responsetext)。 - Tamás
是的,在Python方面完全可以。在JS方面,只需将“innerHTML”替换为“xmlhttp.responseText”,即可按照Python脚本打印的方式显示输出 - 尽管我不确定是否有任何保证您会看到多个状态更改为“ readyState = 3 ”而不仅仅是一个。 - Tamás
这只是一个示例脚本;我实际上会发送很多JSON数据。所以我的担心是1)开销,因为我将发送大量数据,2)解析,因为我需要对传回的每个块进行一些计算。看起来#1不是真正的问题,我相信我可以通过在每个调用上跟踪responseText的位置(将pos设置为responseText.length,然后在下一个调用中使用responseText.substr(pos))来解决#2问题。谢谢! - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接