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的值无关。