【问题标题】:Capturing linux terminal reponse in python在python中捕获linux终端响应
【发布时间】:2020-04-20 12:02:27
【问题描述】:

我正在修改各种 linux 终端(例如 xterm、gnome-terminal 等)中的 VT100 仿真,并且需要帮助以获取 python 脚本以从仿真器接收不可打印的转义序列。我想我掌握了 VT100 仿真部分;这是一个关于python的问题。

我想在 python 中运行以下 VT100“识别终端类型”查询:

print "\x1b[c"
resp = raw_input()
print ":".join(x.encode('hex') for x in resp)   # debugging purpose only

我几乎可以很好地使用终端的 VT100 仿真除了 resp = raw_input() 要求我通过按 ENTER 键手动完成响应。

如何让 python 在没有我手动干预的情况下从 VT100 仿真中获取输入?

【问题讨论】:

  • 一个有趣的方法是运行另一个线程,该线程会在一定时间延迟后按回车键。编辑:这似乎是答案look here
  • 模块pypi.org/project/keyboard 应该会有帮助。

标签: python


【解决方案1】:

在 Unix(-like)系统上,问题不在于 Python 不接受输入,而在于 TTY 子系统甚至不提供它,直到您按下回车键。这样可以将退格删除字符和 ctrl-d 转换为文件结束标记。

您可以使用 tty 模块中的 setcbreaksetraw 更改此设置。

另请参阅 terminal modes 上的 Wikipedia 条目和 Linus Åkesson 的 The TTY Demystified

【讨论】:

【解决方案2】:

这行得通吗?

import subprocess

proc = subprocess.Popen(["echo \x1b[c"], stdout=subprocess.PIPE, shell=True)
resp, err = proc.communicate()

print (":".join(hex(x) for x in resp)) # debugging purpose only

它在python3中,但我相信你可以在2中做大致相同的事情

编辑:
这更好:

import subprocess

resp = subprocess.check_output("echo \x1b[c", shell=True)

print (":".join(hex(x) for x in resp)) # debugging purpose only

【讨论】:

  • 抱歉,两者都不能正常工作。无需按 ENTER 即可生成并捕获响应(感谢您,将对其进行更多研究),但响应不正确。它似乎只是反刍查询命令(即'\x1b[c\n"),而不是我的测试用例的VT100响应(即"\x1b[?62;c")。改用echo -eprintf也没有解决。
  • python -c "print('\x1b[c')" 怎么样?
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2021-01-31
  • 2018-09-23
  • 2011-02-10
  • 2012-04-05
相关资源
最近更新 更多