2011-05-27 22 views
1

我制作了一个我想部署到网络上的python应用程序。我在Mac上,所以我启用了Web服务器并将其放入我的cgi-bin中,并且它工作正常。问题是,应用程序会进行一些密集计算,我真的很想让用户知道执行过程中发生了什么。网络上的Python:在处理它时执行代码?

即使我有print声明散落在代码,它不输出任何东西到我的浏览器,直到整个事情执行完毕。有没有什么办法可以解决这个问题,以便在处理代码时执行代码?

+1

欢迎来到WWW。 ;-)通常,浏览器会等待,直到他们在呈现页面之前收集所有输入。要获得实时更新将需要更复杂的东西,比如AJAX/Comet技术。 – Keith 2011-05-27 06:31:45

+0

谢谢......昨天读了一些文章;试图隐藏的iframe技术和AJAX,但没有运气 – Jeff 2011-05-27 19:52:29

回答

1

而是“打印”,你可能会想尝试

sys.stdout.write('something something something') 
sys.stdout.flush() 

这将确保Web服务器没有等待缓冲区填满。

+0

http://stackoverflow.com/questions/5227166/python-cgi-update-webpage-before-script-exit – 2011-05-27 07:11:06

+0

使用冲水(),但它并没有帮助试过..这个环节重申了这个问题,但没有提供任何解决方案。 – Jeff 2011-05-27 19:51:54

1

如果sys.stdout.flush()没有这样的伎俩,问题很可能是由编码分块传输来解决。

为了给出一点背景知识,chunked-encoding定义了一种机制,在该机制中服务器向前告诉客户端“我的数据流没有限制”,并且作为效率,数据以块的形式传输,而不是只是流式传输内容。

这里有一个简单的例子,重要的是你如何发送数据,并使用标头。

的这另一个方面是什么浏览器实际上做的数据,因为它进来,即使你的CGI是将数据发送到浏览器,它可能只是坐在它,直到它完成。

用下面的例子中,示出了卷曲每个“块”被在流正确下载,Safari浏览器仍然挂起等待CGI来完成。

#!/usr/bin/python 
import time 
import sys 

def chunk(msg=""): 
    return "\r\n%X\r\n%s" % (len(msg) , msg) 

sys.stdout.write("Transfer-Encoding: chunked\r\n") 
sys.stdout.write("Content-Type: text/html\r\n") 

for i in range(0,1000): 
    time.sleep(.1) 
    sys.stdout.write(chunk("%s\n" % ('a' * 80))) 
    sys.stdout.flush() 

sys.stdout.write(chunk() + '\r\n') 

所以,如果你只需要连接到这个CGI与您的浏览器,是啊,你不会看到任何改变 - 不过如果你使用,每次获取数据时,你就可以到AJAX技术,并建立一个处理程序“流”,因为它的用武之地。

+0

靠近!现在它在处理标题后立即发送确认回复...但仍将其余文本分组在一起,无法弄清楚为什么 – Jeff 2011-05-28 04:39:35

+0

实际上,这适用于Firefox,但不适用于Chrome :(我读取了msg长度应该是在十六进制,但没有解决它。 – Jeff 2011-05-28 05:30:42

+0

对于Chrome和Safari浏览器http://stackoverflow.com/questions/169258/is-http-streaming-comet-possible-in-safari - webkit似乎有些愚蠢,祝你好运! – synthesizerpatel 2011-05-29 05:48:38

1

大概是这样的,以单独您的问题的最佳方法。制作一个ajax-drive“控制台”类型的显示器,例如轮询一个日志文件,该文件写在工作进程中。