当前位置:   article > 正文

python命令行or控制台or日志带有颜色的输出_python 命令行颜色

python 命令行颜色

python命令行or控制台or日志带有颜色的输出

python控制台带颜色输出

在几年前,我写过一个项目,喜欢花里胡哨的我看到别人输出到控制台带有颜色,于是我也想要。

于是乎不知道从哪里搜到的资料,是拼凑起来的颜色代码块。

当时用着没问题,现在用着其实也没问题。但一旦迁移到别的平台设备或者是外部调用的时候,就会出现问题。

早期带有颜色输出的代码如下:

msg = "我是一个有颜色的字体!"
print('\033[0;33m{}'.format(msg))
  • 1
  • 2

输出样式如下:

请添加图片描述

对这种方式感兴趣的小伙伴可以去搜索相关资料,但我建议你真的感兴趣,可以往下继续看!

颜色异常输出示例

用之前颜色代码拼凑输出,通过命令行调用的时候,发现直接输出的是颜色代码,而不是带有颜色的字体。

请添加图片描述

这里稍微讲解一下。

在终端中设置输出文本的颜色可以使用 ANSI 转义序列来实现。但是,Windows 中的默认控制台不始终支持 ANSI 转义序列,因此可能无法正确显示颜色。

如果在 Windows 上运行这段代码,并且控制台没有正确显示颜色,可以安装第三方库 colorama 来解决此问题。colorama 库是一个跨平台的 Python 模块,可以使在终端中显示 ANSI 转义序列变得更简单。

划重点:跨平台!!!(我已邀请大佬做过测试,windows,mac完美!)

colorma模块的使用

安装

pip install colorama
  • 1

基本使用

import colorama
from colorama import Fore, Style

# 初始化 colorama 库
colorama.init()

def print_info(msg):
    print(Fore.GREEN + msg + Style.RESET_ALL)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

通过导入 colorama 库,并使用 Fore.GREEN 来设置文本的前景色为绿色,Style.RESET_ALL 用于重置文本的样式,可以在 Windows 控制台上正确显示颜色。

为了正常显示颜色,确保的控制台支持 ANSI 转义序列或安装了 colorama 库。如果使用的是其他操作系统或终端模拟器,通常可以直接使用 ANSI 转义序列来设置输出的颜色。

封装自己的颜色输出

import colorama
# 初始化 colorama 库
colorama.init()
def print_info(msg: str):
    print(colorama.Fore.GREEN + str(msg) + colorama.Style.RESET_ALL)
def print_waring(msg: str):
    print(colorama.Fore.YELLOW + str(msg) + colorama.Style.RESET_ALL)
def print_error(msg):
    print(colorama.Fore.RED + str(msg) + colorama.Style.RESET_ALL)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这样你想输出哪种颜色就调用哪种颜色就好。

你依旧还是想用print进行输出的话,固定一种颜色可以使用如下代码。

import time
import colorama
_print = print
def print(msg:str):
    _print(colorama.Fore.GREEN + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " [mwjApiTest]  " + str(msg) + colorama.Style.RESET_ALL)
    
print("我打印一段文字")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

效果如下

在这里插入图片描述

可支持的颜色:

BLACK           
RED             
GREEN         
YELLOW         
BLUE            
MAGENTA        
CYAN            
WHITE           
RESET          

# These are fairly well supported, but not part of the standard.
LIGHTBLACK_EX   
LIGHTRED_EX     
LIGHTGREEN_EX   
LIGHTYELLOW_EX 
LIGHTBLUE_EX    
LIGHTMAGENTA_EX 
LIGHTCYAN_EX  
LIGHTWHITE_EX 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

对应输出效果

请添加图片描述

带有颜色的日志输出

使用colorlog

colorlog 是一个方便的 Python 日志库,可以帮助在控制台中添加颜色和样式来美化日志输出。下面是 colorlog 库的使用示例:

  1. 安装 colorlog
pip install colorlog
  • 1
  1. 导入 colorlog
import colorlog
  • 1
  1. 创建 colorlog 的日志记录器:
logger = colorlog.getLogger()
  • 1
  1. 添加控制台处理器:
console_handler = colorlog.StreamHandler()
logger.addHandler(console_handler)
#设置输出等级,这里我不进行设置
logger.setLevel("NOTSET")
  • 1
  • 2
  • 3
  • 4
  1. 设置日志记录格式:
log_format = '%(log_color)s%(levelname)s:%(message)s'
console_format = colorlog.ColoredFormatter(log_format)
console_handler.setFormatter(console_format)
  • 1
  • 2
  • 3
  1. 打印日志:
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
  • 1
  • 2
  • 3
  • 4
  • 5

输出样式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGkUMLtS-1692690396784)(images/image-20230730162030148.png)]

通过 colorlog,可以使用 log_color 变量将颜色和样式应用于日志级别(levelname)和消息(message)。可以根据需要自定义日志记录格式。

请注意,在 Windows 上,想要正常显示颜色,需要在使用 colorlog 之前初始化 colorama 来处理 ANSI 转义序列:

import colorama
colorama.init()
  • 1
  • 2

以上是 colorlog 库的基本使用示例。可以按照自己的需求使用更高级的日志功能,如添加文件处理器、设置日志级别等。详细的用法可以参考 colorlog 的文档:https://pypi.org/project/colorlog/

实操:编写带颜色输出的单例模式日志器

这段代码可以直接替换自己以前没有颜色输出的日志代码。

class Logger:
    __instance = None
    # 往屏幕上输出
    screen_output = logging.StreamHandler()

    def __new__(cls, path=None, level='DEBUG', RotatingFileHandler: BaseRotatingHandler = None):
        '''
        单列模式
        :param path: 报告的路径
        :param level: 日志的等级常用,INFO,DEBUG,WARNING,ERROR
        :param RotatingFileHandler:
        '''

        if not cls.__instance:
            colorama.init()
            cls.__instance = super().__new__(cls)
            log = logging.getLogger("mwjApiTest")
            # 设置日志级别
            log.setLevel(level)
            cls.__instance.log = log

        if path:
            if not os.path.isdir(path):
                os.mkdir(path)
            if RotatingFileHandler and isinstance(RotatingFileHandler, BaseRotatingHandler):
                fh = RotatingFileHandler
            else:
                # # 往文件里写入#指定间隔时间自动生成文件的处理器
                fh = TimedRotatingFileHandler(os.path.join(path, 'mwjApiTest.log'), when='D', interval=1,
                                              backupCount=7, encoding='utf-8')

            fh.setLevel(level)
            cls.__instance.log.addHandler(fh)
            # 定义handler的输出格式
            formatter = logging.Formatter("%(levelname)-8s%(asctime)s%(name)s:%(filename)s:%(lineno)d %(message)s")
            fh.setFormatter(formatter)
        return cls.__instance

    def set_level(self, level):
        """设置日志输出的等级"""
        self.log.setLevel(level)

    #### 设置输出的颜色
    def fontColor(self):
        # 不同的日志输出不同的颜色
        formatter = colorlog.ColoredFormatter(
            '%(log_color)s[%(asctime)s] [%(name)s] [%(levelname)s]: %(message)s',
            log_colors={
                'DEBUG': 'cyan',
                'INFO': 'green',
                'WARNING': 'yellow',
                'ERROR': 'red',
                'CRITICAL': 'red,bg_white',
            },
        )
        self.screen_output.setFormatter(formatter)
        self.log.addHandler(self.screen_output)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

测试

aa = Logger()
aa.debug('This is a debug message')
aa.info('This is an info message')
aa.warning('This is a warning message')
aa.error('This is an error message')
aa.critical('This is a critical message')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请添加图片描述

结束!

后续希望我更新什么可以在后台留言哦 ~

公众号:梦无矶的测试开发之路

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/963129
推荐阅读
相关标签
  

闽ICP备14008679号