例如:
#!/usr/bin/python3.4
rep = os.popen("""a=$(echo "\033[6n") && echo $a""").read()
代表返回“\ 033 [6n”...
有人有想法吗?
感谢您的帮助。
编辑: 我有一个部分解决方案:
a=input(print("\033[6n", end='')
但是我需要在输入上按“输入”以获得光标位置。
答案 0 :(得分:0)
问题是
诀窍是使用tty.setcbreak(sys.stdin.fileno(), termios.TCSANOW)
,然后在变量中通过termios.getattr
存储终端属性以恢复默认行为。设置cbreak
,os.read(sys.stdin.fileno(), 1)
即可立即从stdin读取。这也抑制了来自终端的ansi控制代码响应。
def getpos():
buf = ""
stdin = sys.stdin.fileno()
tattr = termios.tcgetattr(stdin)
try:
tty.setcbreak(stdin, termios.TCSANOW)
sys.stdout.write("\x1b[6n")
sys.stdout.flush()
while True:
buf += sys.stdin.read(1)
if buf[-1] == "R":
break
finally:
termios.tcsetattr(stdin, termios.TCSANOW, tattr)
# reading the actual values, but what if a keystroke appears while reading
# from stdin? As dirty work around, getpos() returns if this fails: None
try:
matches = re.match(r"^\x1b\[(\d*);(\d*)R", buf)
groups = matches.groups()
except AttributeError:
return None
return (int(groups[0]), int(groups[1]))