2013-02-17 67 views
0

我想從當前時間無限Popen.stdout對象中獲取最後N行。而無限的我的意思是無限/很多日誌條目正在寫入標準輸出。 我試着Popen.stdout.readline()受時間限制,但這只是產生了很多隨機問題,尤其是輸出很少。 當前輸出的某種快照會幫助我,但我無法找到類似的東西。我主要找到的所有解決方案都是針對終止的外部進程,但我是一個服務器應用程序,應該能夠在讀取最後一行後寫入stdout。如何從無限Popen.stdout對象中獲取最後N行

問候,

Faerbit

+0

雖然這是一個簡單的圖書館,但也許是矯枉過正:我會爲此工作推薦'pexpect'。至少它解決了像子程序緩衝整個數據頁面這樣的問題,因爲它的stdout看起來不是終端。 – 2013-02-17 18:53:38

+0

我不知道這將如何幫助我。它看起來和Popen有相同的閱讀方法。 (他們的網頁也很怪異。) – Faerbit 2013-02-17 19:51:25

+0

你能否給出一個更清晰的例子,說明'無限'Popen是什麼意思?是否就像你有Popen'ed子進程像一個不斷噴出日誌條目的Web服務器,然後你想在控制主進程中獲得N行? – sotapme 2013-02-17 21:09:10

回答

0

在Unix上,當您啓動過程中,你可以把它管道到tail第一:

p=subprocess.Popen("your_process.sh | tail --lines=3", stdout=subprocess.PIPE, shell=True) 
r=p.communicate() 
print r[0] 

shell=True用法是這裏的關鍵。

+0

這不起作用,因爲您錯過了關鍵問題:輸出是無限的!尾部以及溝通()僅適用於終止的進程。在服務器日誌上這是行不通的,因爲你的服務器應該一直在運行。 – Faerbit 2013-02-18 12:42:32

+0

最後N行比什麼都少? – 2013-02-18 14:14:33

+0

考慮將文件輸出到文件中,並在該文件上定期運行尾部。如果輸出已經記錄到日誌文件中,您可以「拖尾」日誌文件 – 2013-02-18 14:36:52