我有一個PYTHON CGI腳本(內容類型:文本/平原)需要大約10分鐘執行。 我想在我的瀏覽器上看到我的腳本的執行狀態。顯示PYTHON CGI腳本的進度
象下面這樣:
一部分執行腳本的1 ...
一部分執行腳本的2 ..
一部分執行腳本的第3 ..
執行完成
我正在使用打印語句,但它只有在腳本完成執行後纔會將所有打印語句全部輸出,而不是逐個輸出。
請幫助..
我有一個PYTHON CGI腳本(內容類型:文本/平原)需要大約10分鐘執行。 我想在我的瀏覽器上看到我的腳本的執行狀態。顯示PYTHON CGI腳本的進度
象下面這樣:
一部分執行腳本的1 ...
一部分執行腳本的2 ..
一部分執行腳本的第3 ..
執行完成
我正在使用打印語句,但它只有在腳本完成執行後纔會將所有打印語句全部輸出,而不是逐個輸出。
請幫助..
嘗試這樣做:
import sys
...
print "Part 1 of script executed..."
sys.stdout.flush() # do this after the print
這刷新標準輸出緩衝器,這可能是你的問題之一的原因。您的瀏覽器或網絡服務器也可能導致此行爲,在這種情況下解決此問題將更加困難。
我不知道你正在嘗試做的,但你可能需要使用AJAX異步火了你的腳本,然後異步加載回數據。對於瀏覽器和web服務器來說,這比處理幾分鐘的cgi腳本更好。
謝謝...這正是我需要的。 – AnonGeek 2011-12-23 10:03:14
我懷疑真正的封鎖點是網關(網絡服務器),而不是您的CGI應用程序。網關技術上必須驗證響應並確保它符合網關與客戶端一起使用的HTTP版本。
我不確定網關是否被允許轉發標頭,直到處理完所有請求。如果你看看在CGI specification根據第3.1「服務器責任」,你可以閱讀以下內容:
的服務器必須在本規範要求的客戶端請求數據進行轉換和協議轉換。此外,即使CGI腳本不符合本規範,服務器仍然對客戶負責遵守相關的網絡協議。
如果腳本需要很長時間才能運行,並且您想要定期更新,那麼重新考慮您的體系結構會更好。看看這種方法的更經典的策略,主要是腳本運行在一個後臺進程中,該進程寫入數據庫並寫入一些AJAX代碼以從服務器獲取通知。根據您用作服務器堆棧的情況,您也可以通過web socket編寫應用程序以進行通信,這將允許您持續連接並隨時發送更新。
感謝您的解釋... – AnonGeek 2011-12-23 10:04:58
嘗試yield
輸出零件而不是return
一個完整的響應。你使用任何Web框架? Web.py has a good example。正如他們所說,
[...]您需要確保您添加Transfer-Encoding chunked標頭才能正常顯示。否則,瀏覽器將在顯示給您之前緩衝所有數據。
如果你不使用web.py或其他web框架,你可以試試它 - 我不知道它是否會工作。
感謝您向我介紹web.py ...但是sys.stdout.flush()是我正在尋找... – AnonGeek 2011-12-23 10:19:18
什麼是您使用的網絡服務器?漸進式響應需要具有分塊編碼能力的「支持HTTP/1.1」的服務器。 – SingleNegationElimination 2011-12-22 16:27:35
我認爲@TokenMacGuy是正確的。可能發生的是你的輸出被緩衝了。 – jcollado 2011-12-22 16:37:54