Python curses打印终端颜色转义码

ACK*_*low 7 python curses bash python-3.x python-curses

我有一个bash脚本打印一个漂亮的大彩色表,使用转义代码生成前景和背景tput.我的curses应用程序需要调用此bash脚本并将输出放在屏幕上.

当我尝试这样做时,curses会以堆栈跟踪结束爆炸:

File "./dostuff.py", line 38, in print_art
    screen.addstr(y, x_start, line)
TypeError: must be str, not bytes
Run Code Online (Sandbox Code Playgroud)

其中"线"是这样的:

'\x1b[44m\x1b[30mcard major minor revision runs updated\x1b(B\x1b[m\x1b(B\x1b[m\n'

有没有办法让诅咒解释这些颜色代码?我可以使用颜色代码对字符串进行任何处理以使curses显示它吗?或者我必须基本上从bash脚本中删除颜色,然后重新实现python中的着色?

编辑:

获取bash输出的命令类似于:

print_art(subprocess.Popen(["./automount", "backup", "list"], stdout=subprocess.PIPE).communicate()[0])
Run Code Online (Sandbox Code Playgroud)

通过调用decode()字节字符串,我可以使用curses来打印字符串,尽管有文字转义序列.除非我听到其他人的意见,否则我只是手动解析这些文字转义序列并转换为使用curses颜色方法.

小智 0

我尝试从网络复制代码:

\n
#!/bin/python\nimport curses\nscreen = curses.initscr()\nscreen.addstr(0, 0, "This string gets printed at position (0, 0)")\nscreen.addstr(3, 1, "Try Russian text:\n")  # Python 3 required for unicode\nscreen.addstr(4, 4, "X")\nline='\\x1b[44m\\x1b[30mcard           major  minor  revision  runs  updated\\x1b(B\\x1b[m\\x1b(B\\x1b[m\\n'\ny=10\nx_start=5\nprint( type(x_start) )\nprint( type(y) )\nscreen.addstr( y, x_start, line)\nscreen.addch(5, 5, "Y")\nscreen.refresh()\ncurses.napms(3000)\ncurses.endwin()\n
Run Code Online (Sandbox Code Playgroud)\n

示例输出:

\n
$ ./dostuff.py\n<class 'int'>\n             <class 'int'>\nThis string gets printed at position (0, 0)\n\n\n Try Russian text: \xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\n    X\n     Y\n\n\n\n\n     ^[[44m^[[30mcard           major  minor  revision  runs  updated^[(B^[[m^[(B^[[m\n
Run Code Online (Sandbox Code Playgroud)\n

几秒钟后更新输出:

\n
$ ./dostuff.py\n<class 'int'>\n             <class 'int'>\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以按 Ctrl s 和 Ctrl q 来停止当前终端的当前输出。\n因此检查以下变量的类型:

\n
y\nx_start\nline\n
Run Code Online (Sandbox Code Playgroud)\n

如果有任何不匹配,请开始使用类似的内容:

\n
str(y)\nor\nstr(x_start)\nor\nstr(line)\n
Run Code Online (Sandbox Code Playgroud)\n

来处理这些异常。

\n