如何实时解析pexpect?

2024-05-15 12:59:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在考虑在我们的一个部署脚本包装器中使用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)

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

^{pr2}$

Tags: thetodebuglogaddformatterlogging部署
1条回答
网友
1楼 · 发布于 2024-05-15 12:59:53

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

Pexpect的Spawn类有一个logfile_read属性,该属性将子进程的输出写入指定的文件。 修改如下所示的代码就可以了。我正在使用系统标准输出它会将所有内容打印到控制台。你可以打开一个文件并使用它

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

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

相关问题 更多 >