如何在ANSI终端中获取光标的位置?

时间:2016-02-20 16:39:52

标签: python terminal

我想在终端窗口中获​​取光标的位置。我知道echo -e "\033[6n"read输出-s可以像this answer一样默默地输出with Capturing() as output: sys.stdout.write("\e[6n") print(output) ,但我怎样才能在Python中执行此操作?

我已尝试this contextmanager这样:

\e[6n

但它只捕获我写的'\x1b[6n'^[[x;yR1)转义序列,而不是我需要的subprocess序列。

我也尝试生成output = subprocess.check_output(["echo", "\033[6n"], shell=False) print(output) 并获取其输出,但同样,只捕获了我写的转义序列:

shell=True

curses使输出成为空字符串列表。

避免\e[6n(因为这应该是简单,穷人的游标pos getter),如何通过打印Blood Collection -------------------- id bloodComponent 1 Whole Blood 2 Platelet 3 Plasma 4 Platelet 5 Plasma 6 Whole Blood 来获取返回的转义序列? / p>

1 个答案:

答案 0 :(得分:3)

我们走了 - 您可以自己阅读sys.stdout来获取价值。 我在一个问题中找到了答案,就像你的问题一样,但对于一个试图从C程序中做到这一点的人来说:

http://www.linuxquestions.org/questions/programming-9/get-cursor-position-in-c-947833/

所以,当我从Python交互式终端尝试了一些东西时:

>>> import sys
>>> sys.stdout.write("\x1b[6n");a=sys.stdin.read(10)                                                                                                                                                     
]^[[46;1R                                                                                                                                                                                                
>>>                                                                                                                                                                                                      
>>> a                                                                                                                                                                                                    
'\x1b[46;1R'                                                                                                                                                                                               
>>> sys.stdin.isatty()                                                                                                                                                                                   
True   

你将不得不使用其他ANSI技巧/位置/重印以避免输出实际显示在终端上,并防止stdin读取阻塞 - 但我认为可以通过一些反复试验来完成。