我製作了一個我想部署到網絡上的python應用程序。我在Mac上,所以我啓用了Web服務器並將其放入我的cgi-bin中,並且它工作正常。問題是,應用程序會進行一些密集計算,我真的很想讓用戶知道執行過程中發生了什麼。網絡上的Python:在處理它時執行代碼?
即使我有print
聲明散落在代碼,它不輸出任何東西到我的瀏覽器,直到整個事情執行完畢。有沒有什麼辦法可以解決這個問題,以便在處理代碼時執行代碼?
我製作了一個我想部署到網絡上的python應用程序。我在Mac上,所以我啓用了Web服務器並將其放入我的cgi-bin中,並且它工作正常。問題是,應用程序會進行一些密集計算,我真的很想讓用戶知道執行過程中發生了什麼。網絡上的Python:在處理它時執行代碼?
即使我有print
聲明散落在代碼,它不輸出任何東西到我的瀏覽器,直到整個事情執行完畢。有沒有什麼辦法可以解決這個問題,以便在處理代碼時執行代碼?
而是「打印」,你可能會想嘗試
sys.stdout.write('something something something')
sys.stdout.flush()
這將確保Web服務器沒有等待緩衝區填滿。
http://stackoverflow.com/questions/5227166/python-cgi-update-webpage-before-script-exit – 2011-05-27 07:11:06
使用沖水(),但它並沒有幫助試過..這個環節重申了這個問題,但沒有提供任何解決方案。 – Jeff 2011-05-27 19:51:54
如果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技術,並建立一個處理程序「流」,因爲它的用武之地。
靠近!現在它在處理標題後立即發送確認回覆...但仍將其餘文本分組在一起,無法弄清楚爲什麼 – Jeff 2011-05-28 04:39:35
實際上,這適用於Firefox,但不適用於Chrome :(我讀取了msg長度應該是在十六進制,但沒有解決它。 – Jeff 2011-05-28 05:30:42
對於Chrome和Safari瀏覽器http://stackoverflow.com/questions/169258/is-http-streaming-comet-possible-in-safari - webkit似乎有些愚蠢,祝你好運! – synthesizerpatel 2011-05-29 05:48:38
大概是這樣的,以單獨您的問題的最佳方法。製作一個ajax-drive「控制檯」類型的顯示器,例如輪詢一個日誌文件,該文件寫在工作進程中。
歡迎來到WWW。 ;-)通常,瀏覽器會等待,直到他們在呈現頁面之前收集所有輸入。要獲得實時更新將需要更復雜的東西,比如AJAX/Comet技術。 – Keith 2011-05-27 06:31:45
謝謝......昨天讀了一些文章;試圖隱藏的iframe技術和AJAX,但沒有運氣 – Jeff 2011-05-27 19:52:29