2011-12-22 68 views
3

我有一個PYTHON CGI腳本(內容類型:文本/平原)需要大約10分鐘執行。 我想在我的瀏覽器上看到我的腳本的執行狀態。顯示PYTHON CGI腳本的進度

象下面這樣:

一部分執行腳本的1 ...

一部分執行腳本的2 ..

一部分執行腳本的第3 ..

執行完成

我正在使用打印語句,但它只有在腳本完成執行後纔會將所有打印語句全部輸出,而不是逐個輸出。

請幫助..

+2

什麼是您使用的網絡服務器?漸進式響應需要具有分塊編碼能力的「支持HTTP/1.1」的服務器。 – SingleNegationElimination 2011-12-22 16:27:35

+0

我認爲@TokenMacGuy是正確的。可能發生的是你的輸出被緩衝了。 – jcollado 2011-12-22 16:37:54

回答

2

嘗試這樣做:

import sys 
... 

print "Part 1 of script executed..." 
sys.stdout.flush() # do this after the print 

這刷新標準輸出緩衝器,這可能是你的問題之一的原因。您的瀏覽器或網絡服務器也可能導致此行爲,在這種情況下解決此問題將更加困難。


我不知道你正在嘗試做的,但你可能需要使用AJAX異步火了你的腳本,然後異步加載回數據。對於瀏覽器和web服務器來說,這比處理幾分鐘的cgi腳本更好。

+0

謝謝...這正是我需要的。 – AnonGeek 2011-12-23 10:03:14

5

我懷疑真正的封鎖點是網關(網絡服務器),而不是您的CGI應用程序。網關技術上必須驗證響應並確保它符合網關與客戶端一起使用的HTTP版本。

我不確定網關是否被允許轉發標頭,直到處理完所有請求。如果你看看在CGI specification根據第3.1「服務器責任」,你可以閱讀以下內容:

的服務器必須在本規範要求的客戶端請求數據進行轉換和協議轉換。此外,即使CGI腳本不符合本規範,服務器仍然對客戶負責遵守相關的網絡協議。

如果腳本需要很長時間才能運行,並且您想要定期更新,那麼重新考慮您的體系結構會更好。看看這種方法的更經典的策略,主要是腳本運行在一個後臺進程中,該進程寫入數據庫並寫入一些AJAX代碼以從服務器獲取通知。根據您用作服務器堆棧的情況,您也可以通過web socket編寫應用程序以進行通信,這將允許您持續連接並隨時發送更新。

+0

感謝您的解釋... – AnonGeek 2011-12-23 10:04:58

1

嘗試yield輸出零件而不是return一個完整的響應。你使用任何Web框架? Web.py has a good example。正如他們所說,

[...]您需要確保您添加Transfer-Encoding chunked標頭才能正常顯示。否則,瀏覽器將在顯示給您之前緩衝所有數據。

如果你不使用web.py或其他web框架,你可以試試它 - 我不知道它是否會工作。

+0

感謝您向我介紹web.py ...但是sys.stdout.flush()是我正在尋找... – AnonGeek 2011-12-23 10:19:18