xterm兼容的TTY颜色查询命令?

时间:2017-07-31 22:45:40

标签: python bash tty xterm

这是从https://github.com/rocky/bash-term-background中提取的一些shell代码,以获取终端背景颜色。我想在Python中模仿这种行为,因此它也可以检索值:

stty -echo
# Issue command to get both foreground and
# background color
#            fg       bg
echo -ne '\e]10;?\a\e]11;?\a'
IFS=: read -t 0.1 -d $'\a' x fg
IFS=: read -t 0.1 -d $'\a' x bg
stty echo
# RGB values are in $fg and $bg

我可以翻译大部分内容,但我遇到问题的部分是echo -ne '\e]10;?\a\e]11;?\a'

我认为:

output = subprocess.check_output("echo -ne '\033]10;?\07\033]11;?\07'", shell=True)

在Python 2.7中是一个合理的翻译,但我没有得到任何输出。在Xterm兼容终端中以bash运行,提供:

rgb:e5e5e5/e5e5e6
rgb:000000/000000

但是在python中我什么都没看到。

更新:正如Mark Setchell所建议的那样,部分问题可能正在子流程中运行。所以当我将python代码更改为:

 print(check_output(["echo", "-ne" "'\033]10;?\07\033]11;?07'"]))

我现在看到RGB值输出,但仅在程序终止后。所以这表明问题是看到输出,我猜xterm是异步发送的。

第二次更新:根据meuh的代码,我在https://github.com/rocky/python-term-background

中提供了更全面的版本

1 个答案:

答案 0 :(得分:2)

您需要将转义序列写入stdout并在将其设置为原始模式后读取stdin上的响应:

#!/usr/bin/python3
import os, select, sys, time, termios, tty

fp = sys.stdin
fd = fp.fileno()

if os.isatty(fd):
    old_settings = termios.tcgetattr(fd)
    tty.setraw(fd)
    print('\033]10;?\07\033]11;?\07')
    time.sleep(0.01)
    r, w, e = select.select([ fp ], [], [], 0)
    if fp in r:
        data = fp.read(48)
    else:
        data = None
        print("no input available")
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    if data:
        print("got "+repr(data)+"\n")
else:
    print("Not a tty")