2016-12-26 58 views
0

有下面的代碼:pexpect如何分析孩子的stdout?

child = pexpect.spawn("prog") 
#some delay... 
child.expect(Name .*:) 
child.sendline('anonymous') 

當孩子進程已經開始可以開始發送到標準輸出大量的數據,例如日誌信息。這是否意味着pexpect開始查找所有孩子的標準輸出(從流程開始到當前時刻)?或者只有在撥打expect後纔開始做?

我的子進程會產生大量的日誌信息。而且CPU速度很慢。我想這樣的Pexpect的的實現可以引起孩子進程產生

+0

什麼是*分析*?什麼是* CP *? – pynexj

+0

@whjm即pexpect是否存儲所有stdout數據?當孩子。expect()'調用pexpect是否查找所有流(從流程開始到當前時刻)?如果這是真的,那麼pexpect會執行很多工作(如果孩子爲其stdout寫入了許多數據) – Mergasov

回答

1

後,孩子會write()其數據發送到pty(從側),並從PTY(主機側)等待父母read()數據。如果沒有child.expect(),則由於寫入緩衝區已滿而輸出太多數據時,可能會阻止孩子的write()

child.expect()匹配一個模式,它會返回,然後你必須再次調用child.expect(),否則在輸出太多數據後孩子可能仍然被阻塞。

見下面的例子:

# python 
>>> import pexpect 
>>> ch = pexpect.spawn('find /') 
>>> ch 
<pexpect.pty_spawn.spawn object at 0x7f47390bae90> 
>>> 

此時find被催生和它已經輸出一些數據。但我沒有撥打ch.expect(),所以find現在被阻止(睡眠),並且不消耗CPU。

# ps -C find u 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
root 100831 0.0 0.2 9188 2348 pts/12 Ss+ 10:23 0:00 /usr/bin/find/
# strace -p 100831 
Process 100831 attached 
write(1, "\n", 1    <-- The write() is being blocked 

這裏的STAT S意味着睡覺(和s意味着會議領導+意味着前臺進程)。


根據Pexpect的的文件,產卵的兩個選項()可能會影響性能:

maxread屬性設置讀取緩衝區的大小。這是Pexpect一次嘗試從TTY讀取的最大字節數。將maxread大小設置爲1將關閉緩衝。 設置maxread 較高的值可能有助於在從孩子讀取大量輸出的情況下的性能。 此功能與searchwindowsize一起使用非常有用。

當關鍵字參數searchwindowsizeNone(默認值)時,將在每次接收傳入數據的迭代中搜索完整緩衝區。在每次迭代中掃描的默認字節數非常大,可以減少 和以減少搜索成本expect()返回後,完整的緩衝區屬性 保持高達maxread的大小,與searchwindowsize的值無關。