我如何实时解析pexpect?

时间:2016-06-24 20:24:50

标签: python python-2.7 pexpect

我在我们的部署脚本包装器中考虑pexpect(完全开放替代方案,如果有更好的方法我不知道) - 但我需要一种方法来阅读实时输出,不仅在我们点击EOF之后。由于这是一个用于所有环境的部署包,因此我们需要在问题发生时尽快发现问题(如果情况非常糟糕,可能会遇到紧急情况)。

我可以使用这样的东西吗?理想情况下,我想使用我们现有的记录器..

def SetupLogging():
    # the logger
    # set to DEBUG since the reports should already give
    # any information we're looking for at a glance
    global log 
    log = logging.getLogger('ansiwrap')
    log.setLevel(logging.DEBUG)

    # create file handler which logs everything
    fh = logging.FileHandler('ansiwrap.debug', mode='w')
    fh.setLevel(logging.DEBUG)

    # create console handler with a higher log level
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)

    # create formatter and add it to the handlers
    formatter = logging.Formatter('[%(asctime)s] | %(name)s - %(levelname)s - %(message)s')
    ch.setFormatter(formatter)  
    fh.setFormatter(formatter)

    # add the handlers to logger
    log.addHandler(ch)
    log.addHandler(fh)

为了完整起见,这是一个示例实现,但对我来说似乎很笨:

child = pexpect.spawn(cmd)
while True:
    try:
        child.expect('\n')
        print(child.before)
    except pexpect.EOF:
        break 

1 个答案:

答案 0 :(得分:0)

当子进程终止时,

EOF被命中。要获得正在发送的命令和接收的回复的实时输出,您可以将输出记录到stdout或文件。

Pexpect的Spawn类有一个logfile_read属性,它将子进程的输出写入指定的文件。 修改如下所示的代码将完成这项工作。我正在使用sys.stdout,它会将所有内容打印到控制台。您可以打开文件并使用它

child = pexpect.spawn(cmd)
child.logfile_read = sys.stdout
while True:
    try:
        child.expect('\n')
        print(child.after)
    except pexpect.EOF:
        break 

仍需要while块的原因是因为根据文档日志文件在每次写入后都会刷新。由于写入不存在,对expect的调用将导致刷新文件。