8

注意:我在研究如何实际做到这一点后问这个问题。其他有点相似但实际上与我的问题不同的问题涉及:

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

我在找什么: 我已经有一个简单的 python 脚本(比如 test.py),我正在从 Gnome 终端执行它。

python test.py

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: ''

我希望错误关键字以粗体红色显示,例如特定颜色的行号,以便于追踪错误。

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

谢谢!

4

4 回答 4

10

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

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

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

于 2018-10-13T21:20:56.847 回答
4

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

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

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

根据https://stackoverflow.com/a/20910449,让我们使用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"
    }

重新加载

$ 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" \
    }

彩色 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

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


过时的

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

对于那些想知道如何使用的人,需要安装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 

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

并验证 vimcat 是否正常工作/已正确获取:

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
于 2019-12-28T00:00:10.183 回答
1

快速破解解决方案,仅限 UNIX。将标准输出重定向到带有 .py 后缀的文件。然后显示文件vimcat用于彩色输出。将这一切包装在一个 shell 函数中。例如在 bash 中;

# print colorised python output
colorized() {
    local out='out.py'
    if (( $# < 1)) 
    then
        printf "Usage: %s pyhon-script\n" $0 >&2
        return 1;
    fi
    if [ -e $out ]; 
    then
        rm $out
    fi
    python $@ 2> $out
    empty=$(stat $out | grep empty)
    if (( $? == 1 ))
    then
        vimcat $out
    fi
}
于 2015-12-01T20:03:04.857 回答
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))

结果:

呃

于 2014-08-03T21:30:06.700 回答