pexpect and logging integration

Lars Stavholm stava at telcotec.se
Thu Mar 11 03:43:50 EST 2010


It works like a charm, thank you!
/Lars

Jean-Michel Pichavant wrote:
> Lars Stavholm wrote:
>> Hi all,
>>
>> has anyone managed to integrate pexpect and logging?
>>
>> I.e., I'd like to be able to pick up the dialog,
>> commands sent and responses received, in my logging.
>> I know about the pexpect logfile, and I can log things
>> to stdout or stderr, but I really need to log using the
>> python logging library.
>>
>> Any thoughts appreciated
>> /Lars
>>
>>   
> I had to implement this.
> It's a bit of a hack, but it does the job.
> 
> The following code is tested with python 2.5, I remember pexpect behaves
> slightly differently in python 2.3.
> 
> import logging
> import pexpect
> import re
> 
> # this will be the method called by the pexpect object to log
> def _write(*args, **kwargs):
>    content = args[0]
>    # let's ignore other params, pexpect only use one arg AFAIK
>    if content in [' ', '', '\n', '\r', '\r\n']:
>        return # don't log empty lines
>    for eol in ['\r\n', '\r', '\n']:
>        # remove ending EOL, the logger will add it anyway
>        content = re.sub('\%s$' % eol, '', content)
>    return logger.info(content) # call the logger info method with the
> reworked content
> 
> 
> # our flush method
> def _doNothing():
>    pass
> 
> # get the logger
> logger = logging.getLogger('foo')
> 
> # configure the logger
> logger.handlers=[]
> logger.addHandler(logging.StreamHandler())
> logger.handlers[-1].setFormatter(logging.Formatter("%(asctime)s -
> %(name)s - %(levelname)s - %(message)s"))
> logger.setLevel(logging.INFO)
> 
> # give the logger the methods required by pexpect
> logger.write = _write
> logger.flush = _doNothing
> 
> p = pexpect.spawn('echo "hello world !!"', logfile=logger)
> p.expect('!!')
> 
> ... 2010-03-10 15:01:31,234 - foo - INFO - hello world !!
> 
> Hope it helps.
> 
> JM
> 
> 





More information about the Python-list mailing list