2
我想創建一個流對象,在任何時候寫入數據時觸發一個回調函數。監視流類
class MonitoredStream():
def __init__(self, outstream, callback):
self.outstream = outstream
self.callback = callback
def write(self, s):
self.callback(s)
self.outstream.write(s)
def __getattr__(self, attr):
return getattr(self.outstream, attr)
這工作得很好,當我直接調用write方法,但我很想擁有它也工作時,我有卡掛於流子輸出。例如:
def f(s):
print("Write")
p = sub.Popen(["sh", "test.sh"], stdout=MonitoredStream(sys.stdout, f))
p.communicate()
這只是將輸出直接發送到sys.stdout,完全繞過寫入功能。有沒有辦法可以監控這個輸出呢?
這些都是很好的想法,但如果我正確理解它們,它們都會等到流關閉之後再將回調函數應用於整個輸出。理想情況下,我希望在任何時候有一行可用於讀取流時應用回調函數。 –
這是真的,雖然,據我所知,'subprocess.communicate()'已經這樣做了,所以它應該是一個非問題。 –
哦,我明白了。如果是這種情況,我將不得不尋找另一種方法。我的用例是我有一個長時間運行的進程生成日誌輸出,並且我希望能夠監視輸出並以實時方式做出反應(在進程完成之前)。我只是將輸出設置爲'subprocess.PIPE'並逐行讀取而不是使用'subprocess.communicate()' –