如何更改PExpect输出使用的行尾

从pexpect.run()返回的输出在每行末尾都包含\ r \ n。使用print(returnVal.decode())打印到终端可以为返回的每一行正确打印一行。当我检查输出时,我看到字节字符串包含\ r \ n。当我将其记录到文件中时,我得到了两次返回到日志文件的信息。我在使用Python 3.7的Mac上。写输出时,有没有办法设置首选的新行?我正在使用pythons日志记录类,并使用info()方法编写字符串。输出看起来像这样:

total 80
-rw-r--r--   1 xxxx  admin  1048 Nov 12 00:41 Constants.py

-rw-r--r--   1 xxxx  admin  5830 Nov 12 13:33 file1.py

-rw-r--r--   1 xxxx  admin  2255 Nov 12 00:51 file2.py

看起来应该像这样:

total 80
-rw-r--r--   1 xxxx  admin  1048 Nov 12 00:41 Constants.py
-rw-r--r--   1 xxxx  admin  5830 Nov 12 13:33 file1.py
-rw-r--r--   1 xxxx  admin  2255 Nov 12 00:51 file2.py

这是我原来的Logger类的简化版本:

class Logger():
    def __init__( self,path ):
        msgFormat   = '%(asctime)s.%(msecs)d\t%(message)s'
        dateFormat  = '%m/%d/%Y %H:%M:%S'
        logging.basicConfig( format=msgFormat,datefmt=dateFormat,filename=path,level=logging.INFO )

    def Log ( self,theStr ):
        logging.info( str( theStr ))

从Pexpect返回的字符串类似于:

Line1\r\nLine2
fcliuhongpeng 回答:如何更改PExpect输出使用的行尾

根据记录输出的方式,建议先将换行符格式化后再发送到记录器。但是,如果必须重写FileHandler的日志记录模块的换行参数,并且作为实验,可以通过猴子修补其_open方法来实现,因为默认情况下该功能不可用。

我使用Python 3.8版的源代码来获取_open函数的定义。

import logging

def custom_open(self):
    """
    Monkey patched _open function of class logging.FileHandler (Python 3.8)

    """
    return open(self.baseFilename,self.mode,encoding=self.encoding,newline='')

logging.FileHandler._open = custom_open

if __name__ == "__main__":

    pexpect_return = "Output\nTest"
    my_log = logging.getLogger("test_logger")
    my_log.setLevel(logging.INFO)
    my_log.addHandler(logging.FileHandler("test.log"))
    my_log.info(pexpect_return)

工作方式

Python的日志记录模块具有类FileHandler,该类使用方法_open创建文件处理程序对象以写入并追加到磁盘上的日志文件。从3.8版开始,它的默认实现没有newline参数,因此它使用默认换行符。

猴子补丁是在程序运行时替换或更新其中一个导入类中的方法/功能时。这行logging.FileHandler._open = custom_open告诉python用我的_open方法替换FileHandler类的custom_open方法。之后,当我使用my_log.addHandler(logging.FileHandler("test.log"))时,将使用新的custom_open方法打开带有换行符的文件。

您可以通过在文件名中添加一个后缀来进一步确认是否使用新方法打开文件:

return open(self.baseFilename+"__Monkey_Patched",newline='')

如果您现在将运行该演示代码,则文件名将为“ test.log__Monkey_Patched”。

但是,此代码不会替换您作为记录字符串的一部分传递给记录器的任何换行符。您需要事先进行处理。

本文链接:https://www.f2er.com/3113662.html

大家都在问