Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除ANSI颜色代码时打印到标准输出和日志文件_Python_Logging_Stdout_Ansi Colors - Fatal编程技术网

Python 删除ANSI颜色代码时打印到标准输出和日志文件

Python 删除ANSI颜色代码时打印到标准输出和日志文件,python,logging,stdout,ansi-colors,Python,Logging,Stdout,Ansi Colors,我有以下功能来为屏幕消息着色: def error(string): return '\033[31;1m' + string + '\033[0m' def standout(string): return '\033[34;1m' + string + '\033[0m' 我使用它们如下: print error('There was a problem with the program') print "This is normal " + standout("and

我有以下功能来为屏幕消息着色:

def error(string):
    return '\033[31;1m' + string + '\033[0m'

def standout(string):
    return '\033[34;1m' + string + '\033[0m'
我使用它们如下:

print error('There was a problem with the program')
print "This is normal " + standout("and this stands out")
我希望在不使用ANSI颜色代码的情况下将输出记录到一个文件中(除了标准输出),希望不必在每个
print
语句中添加第二行“记录”

原因是,如果您只是
python program.py>out
,那么文件
out
将具有ANSI颜色代码,如果在纯文本编辑器中打开,这看起来很糟糕


有什么建议吗?

sys.stdout.isatty
功能可能有助于:

from sys import stdout

def error(string, is_tty=stdout.isatty()):
    return ('\033[31;1m' + string + '\033[0m') if is_tty else string

def standout(string, is_tty=stdout.isatty()):
    return ('\033[34;1m' + string + '\033[0m') if is_tty else string

这实际上是我想使用的一个默认用法,它不是设置为<代码> NOT/CODE> >,因为默认参数在Python编译时被评估,而不是在运行时像C++ +…/P>中被评估。


如果您确实需要,也可以显式重写该行为,尽管在重定向标准输出时,这不允许您操纵标准输出本身。是否有任何理由不使用
日志记录
模块(可能您不知道)?

如果您希望打印到终端和日志文件,那么我建议使用日志记录模块。您甚至可以定义自定义格式化程序,因此登录到该文件可以清除终端代码:

import optparse
import logging

def error(string):
    return '\033[31;1m' + string + '\033[0m'

def standout(string):
    return '\033[34;1m' + string + '\033[0m'

def plain(string):
    return string.replace('\033[34;1m','').replace('\033[31;1m','').replace('\033[0m','')

if __name__=='__main__':
    logging.basicConfig(level=logging.DEBUG,
                        format='%(message)s',
                        filemode='w')
    logger=logging.getLogger(__name__)    
    def parse_options():    
        usage = 'usage: %prog [Options]'
        parser = optparse.OptionParser()
        parser.add_option('-l', '--logfile', dest='logfile', 
                          help='use log file')
        opt,args = parser.parse_args()
        return opt,args
    opt,args=parse_options()
    if opt.logfile:
        class MyFormatter(logging.Formatter):
            def format(self,record):
                return plain(record.msg)
        fh = logging.FileHandler(opt.logfile)
        fh.setLevel(logging.INFO)
        formatter = MyFormatter('%(message)s')
        fh.setFormatter(formatter)
        logging.getLogger('').addHandler(fh)

    logger.info(error('There was a problem with the program'))
    logger.info("This is normal " + standout("and this stands out"))
test.py
仅打印到终端

test.py-l test.out
打印到终端和文件
test.out


在所有情况下,发送到终端的文本都有颜色代码,而日志记录没有颜色代码。

unubtu下面的回答很好,但我认为MyFormatter需要稍加修改,以在format()方法中强制格式化


回答得很好-这可能正是我需要的。我实际上使用的是日志模块,但希望让用户可以选择重定向输出并获得一个人类可读的文件。日志本身是由日志模块创建的(使用您的方法,我很可能会得到我想要的)。非常感谢!
class MyFormatter(logging.Formatter):
        def format(self,record):
            msg = super(MyFormatter, self).format(record)
            return plain(msg)