2011-07-06 80 views
1

我基本上有一個用perl編寫的後端程序。該程序將某些配置推送到網絡設備上。它提供了大量的輸出,我希望用戶能夠在程序運行時看到它。到目前爲止,這一直很容易,因爲我一直在從終端運行。django前端運行子進程輸出到瀏覽器窗口

現在我正在嘗試編寫一個django應用程序。我基本上想要一個用戶按提交,瀏覽器將它們帶到一個新頁面,並在這個新頁面上,我希望用戶看到該程序運行時的文本輸出。

我已經成功地得到使用backgroound運行程序: http://docs.python.org/library/subprocess.html

說下面是一個簡單的請求。在響應的網頁我想看看該程序的輸出運行實況,或者至少刷新看到最新的輸出每隔幾秒鐘(可能是一個workaroudn現在)

def config(request): 
    builder_Config_list = Config.objects.all().order_by('-generated_date')[:100] 
    if 'hostname' in request.POST and request.POST['hostname']: 
     hostname = request.POST['hostname'] 
     command = "path/to/builder.pl --router " + hostname 
     result = subprocess.Popen(command.split(), stdout=subprocess.PIPE) 
     return render_to_response('config/config.html', {'result':result, }) 
+0

這似乎很合理 - 你的問題是什麼? – jMyles

+0

對不起,我應該添加一個最後的問題。它是「如何調整上面的代碼片段,以便程序」builder.pl「將輸出顯示給屏幕。output.pl基本上是一個期望腳本,它會登錄到路由器並進行一些配置。我希望用戶看到這發生在瀏覽器屏幕上。謝謝 – evolution

回答

2

可以讀取子進程的輸出像這樣...

pipe = subprocess.Popen(command.split(), stdout=subprocess.PIPE) 
result = pipe.stdout.read() # this is the output of the process 
return render_to_response('config/config.html', {'result': result}) 

但是,您只能在流程結束後才能看到結果。如果你想在程序運行時看到輸出,那將會有點困難。我猜想可以通過將子進程調用放入單獨的進程或線程中,讓進程寫入文件或消息隊列,然後從視圖中的該文件讀取來完成。

+0

是的,有進程輸出其STDERR和STDOUT文件,然後單獨顯示這些文件可能是最好的解決方案。當然,增加複雜性需要存儲文件名和他們關聯的用戶,以便恢復丟失的會話,等等。 – kcbanner

+0

Ya我認爲stdout和stderr可以放在足夠方便的文件中。上面的代碼看起來好像它會阻塞,直到代碼輸出或部分這說我需要嘗試確保:-)我想我可以輸出到文件並每隔幾分鐘刷新一次屏幕,通過設置一些HTTP META標記來設置輸出屏幕刷新,但似乎有點老套。 – evolution

+0

我可能會這樣做使用類似的東西:http://stackoverflow.com/questions/2922874/how-to-stream-an-httpresponse-with-django - 雖然我嘗試了這一點,迄今它只是給了我一個靜態頁面與發電機功能的第一個輸出。 – evolution