如何在Gnome终端中为Python错误的输出着色?

Sha*_*len 5 python error-handling terminal colors gnome-shell-extensions

注意:在研究如何实际执行此操作后,我会问这个问题。其他与我的问题有些相似但实际上不同的问题涉及:

  1. 彩色编码的python脚本
  2. 脚本中导入颜色库
  3. 使用诸如Solarized改进工具之类的工具Vim对python代码进行颜色编码。

我要寻找的是: 我已经有一个简单的python脚本(例如test.py),并且正在Gnome终端上执行它。

python test.py
Run Code Online (Sandbox Code Playgroud)

test.py将在终端上输出一些错误。错误示例:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    with open('', 'rb') as csvfile:
IOError: [Errno 2] No such file or directory: ''
Run Code Online (Sandbox Code Playgroud)

我希望错误关键字以粗体红色表示,例如,行号具有特定的颜色,以便易于查找错误。

如您所见,Stackoverflow已经很好地对错误进行了颜色编码。在我的Gnome终端上,输出是单色的。如何在终端上获得如此出色的颜色编码输出?

谢谢!

ora*_*als 8

[注:颜色于 2021 年 12 月 7 日更新,更加清晰:)]

注意:不直接回答上面的问题,因为我不擅长sed。但这提高了可读性,并且与其他需要 ipython/ 的慢速相比,这是我实际经常使用的。

当前(轻量级解决方案——例如,不需要安装任何东西,也不必一一编辑现有的Python文件)

根据/sf/answers/1463731461/,我们使用sedANSI 颜色代码。

添加~/.bashrc

norm="$(printf '\033[0m')" #returns to "normal"
bold="$(printf '\033[0;1m')" #set bold
red="$(printf '\033[0;31m')" #set red
boldyellowonblue="$(printf '\033[0;1;33;44m')" 
boldyellow="$(printf '\033[0;1;33m')"
boldred="$(printf '\033[0;1;31m')" #set bold, and set red.

copython() {
        python $@ 2>&1 | sed -e "s/Traceback/${boldyellowonblue}&${norm}/g" \
        -e "s/File \".*\.py\".*$/${boldyellow}&${norm}/g" \
        -e "s/\, line [[:digit:]]\+/${boldred}&${norm}/g"
    }
Run Code Online (Sandbox Code Playgroud)

重新加载

$ source ~/.bashrc

原来的样子

$ python main.py

终端中没有彩色 python 回溯

读起来很烦人。现在与

$ copython main.py

[终端中的彩色 python 回溯

它有点花哨,但我很满意,而且我不懂 ANSI 代码,所以这些是我坚持使用的颜色:)


颜色更新得更加赏心悦目 [2021 年 12 月 7 日]

# ---
# Color python error output
# ---

norm="$(printf '\033[0m')" #returns to "normal"
bold="$(printf '\033[0;1m')" #set bold
red="$(printf '\033[0;31m')" #set red
boldyellowonblue="$(printf '\033[0;1;33;44m')" #set blue bkgrd, bold yellow text
boldyellow="$(printf '\033[0;1;33m')" #set gold yellow text
boldred="$(printf '\033[0;1;31m')" #set bold red

# Color error messages from python, use as "copython test.py" instead of "python test.py"
# WARNING: Takes time to run (small but noticeable)
# May also interfer with print to console (for long running programs) 
copython() {
    python $@ 2>&1 | sed -e "s/Traceback/${boldyellowonblue}&${norm}/g" \
        -e "s/File \".*\.py\".*$/${bold}&${norm}/g" \
        -re "s/\, line [0-9]\+/${boldred}&${norm}/g" \
        -re "s/ {4}(.*)$/${boldyellow}&${norm}/g" \ 
        -e "s/.*Error:.*$/${boldred}&${norm}/g" \
    }
Run Code Online (Sandbox Code Playgroud)

彩色Python输出


关于 ANSI 颜色代码的注意事项

请注意,这\033[标志着代码的开始,这有助于我更好地理解正在发生的事情。

0m # normal
0;1m # bold 
0;1;33;44m # bold yellow on blue 
0;1;33m # bold yellow 
0;1;31m # bold red
Run Code Online (Sandbox Code Playgroud)

所以我猜第一个1表示粗体,然后第二个33表示前景色,第三个44表示背景色。类似的事情。


过时的

我也在寻找不需要修改我想要打印错误消息的每个 python 文件的东西。我并不清楚如何使用托宾的答案。

对于那些想知道如何使用的人,需要安装vimcat,然后将上述函数添加到 bashrc (或您源的其他文件),然后运行$ colorized test.py(而不是$ python test.py

例如

~$ wget https://raw.githubusercontent.com/vim-scripts/vimcat/master/vimcat vimcat
~$ mv vimcat /usr/share/bin  # or /home/bin or wherever you want
~$ echo $PATH # make sure vimcat's directory is in your PATH variable, if not add to `~/.bashrc`
home/rui/.local/bin:/usr/local/sbin:/usr/share/bin
~$ source ~/.bashrc # reload PATH if had to add vimcat location
~$ vimcat somefile.sh # test that vimcat can be called
~$ colorized calibrate.py 
Run Code Online (Sandbox Code Playgroud)

对我来说之前和之后的样子: 之前和之后

并验证 vimcat 是否正常工作/来源是否正确:

维姆猫

请注意,这确实需要更多的时间来运行!

$ time colorized calibrate.py 
real    0m0.484s
user    0m0.392s
sys 0m0.085s

rui@chaiX1YG2:~$ $ time python calibrate.py 
real    0m0.343s
user    0m0.271s
sys 0m0.072s
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用 IPython 着色。只需将其放在程序的开头即可。然后,每个异常都将由 Ultratb 处理并以颜色显示,并显示产生异常的代码片段的 locals() 值。

import sys
from IPython.core import ultratb
sys.excepthook = ultratb.FormattedTB(mode='Verbose', color_scheme='Linux', call_pdb=False)
Run Code Online (Sandbox Code Playgroud)

即使您使用 vanilla python 解释器调用脚本,这也将起作用。


beh*_*uri 0

FWIW,您可以将脚本包装在一个main函数中,然后maintry ... except块中调用该函数,获取错误消息,对其进行着色并打印;

要获取错误消息,您需要调用sys.exc_info. traceback.format_exception格式化堆栈跟踪和异常信息。使用基本的正则表达式,您可以将每个内容包装..Err..在 a 内\033[91m...Err...\033[0m,将颜色变为红色:

def main():
   with open('xxx.txt', 'r') as fin:
        return fin.read()

try:
    main()
except:
    import re
    from sys import exc_info
    from traceback import format_exception

    RED, REV = r'\033[91m', r'\033[0m'
    err = ''.join(format_exception(*exc_info()))
    print(re.sub(r'(\w*Err\w*)', RED + r'\1' + REV, err))
Run Code Online (Sandbox Code Playgroud)

结果:

呃