2011-05-27 60 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「控制檯」類型的顯示器,例如輪詢一個日誌文件,該文件寫在工作進程中。