2010-09-17 67 views
4

我有一個簡單的工作流程[Step 0]->[1]->[2]->...->[Step N]。主程序知道它當前所在的步驟(狀態)。將Python腳本的狀態流式傳輸到網站

我想將這個實時流式傳輸到一個網站(在局域網中),這樣當我的同事打開http://thecomputer:8000時,他們可以看到我們工作流程當前狀態的實時渲染,並顯示任何相關的細節。

我已經將腳本的狀態寫入StringIO對象(流式傳輸到它)並使用Javascript刷新瀏覽器,但我真的不知道如何實際執行此操作。

有什麼建議嗎?

回答

1

你可以讓python腳本在你的網頁中寫入一個你在ajax請求中獲得的xml文件,並從中獲取狀態信息。

+0

但你怎麼能不用每次都重寫它更新一個XML文件?有沒有辦法「更新」一個XML文件(即在中間的某個地方添加'')。正如你將根據我的問題正確判斷,我是這裏的新手。 – Escualo 2010-09-17 21:56:51

+0

只需覆蓋它並進行前端輪詢即可。 – Daenyth 2010-09-17 23:08:17

+0

這是一個很好的方法來做到這一點!如果您真的想保留腳本執行的整個歷史記錄,只需將節點附加到XML上,像lxml這樣的好庫就可以讓您的生活更輕鬆地完成這個xml創建任務。 – 2010-09-18 03:54:05

0

如果你只是一個快速的解決方案而不是一個完整的網頁,請查看SimpleHTTPServer你可以將你的狀態信息以文件的形式寫入到一個目錄中,並且它被更新以供其他人查看。

不漂亮,但非常快速,非常容易。

對於演示,只需輸入python -m SimpleHTTPServer這將創建一個網頁,其地址爲http://[your computer's name or IP]:8000,其中包含當前工作目錄的內容。這些文件是熱鏈接的。如果你點擊一個文件,它會顯示在瀏覽器中;如果你點擊一個目錄,你就會切換到該目錄,並且列出它的內容。

對於您的使用,您可以從一個空目錄開始,並創建與您要報告的步驟相匹配的文件。您可以將文件命名爲您的步驟,例如「步驟1.txt」,以及該文件中的更詳細的信息。第1步可能是您的腳本在第1步完成後創建的目錄等。

或者,查看Twisted,這將允許您直接從Python腳本提供HTTP請求。

如果/當你想要更有魅力時,你可以使用基本相同的方法。從你的python腳本中,你將輸出寫入一個空目錄的文件中。從使用PHP的Web服務器上,編寫一個簡單的腳本來檢查該目錄並顯示找到的內容。將頁面上的刷新間隔設置爲某個值,並在瀏覽器的瀏覽器中自行更新。

0

我對Python的工作原理並不瞭解,但如果它是PHP,這很容易(如果你知道你應該做什麼)。

讓我說我的應用程序是myapp.py,它的工作從步驟1到步驟N.我會讓它返回(簡單文本),一個數字。這個數字是它的步數。例如,如果我撥打http://localhost/myapp.py,它將返回5. 30分鐘後,我重新加載頁面,返回15.

現在是JavaScript的事情。我會推薦使用jQuery。它使事情變得更容易和更快。我所要做的只是

$('#streaming').load('http://localhost/myapp.py'); 

這會將頁面內容加載到ID = streaming的DIV。但是隻有當你加載頁面時纔會發生這種情況。要每隔x秒發生一次,請使用JavaScript settimeout函數。

var t=setTimeout("javascript statement",milliseconds); 

這將是更好的存儲加載功能步驟的一部分,把它當頁面加載,並與setTimeout的。一旦腳本停止工作(使用特殊號碼/消息),它也將有助於停止setTimeout。

0

使用普通的JavaScript,您的選擇是Comet,WebSockets和Ajax。但是,我對這些中的任何一個都不太瞭解。看看一些網站:

http://en.wikipedia.org/wiki/Comet_(programming)

http://www.websockets.org/

據我所知,彗星僅僅包括,一個長壽命的Ajax請求發送到Web服務器,其中一個腳本可以將數據作爲必要的時候推。 WebSockets僅在某些瀏覽器的最新版本中受支持。最簡單的解決方案是奧馬爾阿比德建議的:每隔一段時間通過Ajax輪詢Web服務器。

0

您可以將一個服務器實例添加到您的應用程序中,以響應給定端口上的查詢,無論您的應用程序決定共享哪個端口。在單獨的線程中訪問應用程序狀態信息,然後讓您的網頁或監控程序向該端口發送請求。當然,您可以用不同的方式迴應不同的要求。你需要的所有信息是https://pymotw.com/3/socket/tcp.html但下面的代碼將讓你開始:

# borrowed from https://pymotw.com/3/socket/tcp.html 
import socket 
import sys 

# Create a TCP/IP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# Bind the socket to the port 
# (the host name used will need to be pingable from the requesting service) 
server_address = ('', 10000) 
print('starting up on {} port {}'.format(*server_address)) 
sock.bind(server_address) 

# Listen for incoming connections 
sock.listen(1) 

while True: # add a terminator based on your application state 
    # Wait for a connection 
    print('waiting for a connection') 
    connection, client_address = sock.accept() 
    try: 
     print('connection from', client_address) 

     # Receive the data in small chunks and retransmit it 
     while True: 
      data = connection.recv(16) 
      # print('received {!r}'.format(data)) 
      if data: # add a check to ensure the request is valid 
       print('sending data back to the client') 
       data = 'Current application state is:' + getStatus() 
       connection.sendall(data.encode()) 
      else: 
       print('no data from', client_address) 
       break 
    finally: 
     # Clean up the connection 
     connection.close()