首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >监听ssh终端上的击键

监听ssh终端上的击键
EN

Stack Overflow用户
提问于 2021-01-06 18:55:30
回答 2查看 196关注 0票数 0

我有一个Python脚本,它侦听箭头向下键和向上键,并通过在一些选项之间移动光标来做出反应。我已经使用pynput实现了这一点。它在我的机器上运行得很好,但是当我尝试通过SSH在我的Raspberry Pi上运行它时,它不能工作。这是我在终端上看到的:

我已经按了两次向下箭头,因此出现了双^[[B,并且x光标应该已经移动到了最后一个方括号。

我看过this issue,它让我觉得pynput不适合我的任务。有什么变通方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-06 20:39:55

pynput模块监视Linux输入子系统,该子系统用于连接到本地机器的输入设备(键盘、操纵杆、鼠标等)。通过ssh连接接收的击键不会由输入子系统处理,因为它们不是来自输入设备--它们只是通过网络连接传入的数据。

您的代码应该只监视标准输入的击键,而不是依赖于pynput。无论是在本地运行还是在ssh连接上运行,这都是有效的。

棘手的部分是,正如您在问题中所示,光标移动键(如向下箭头)会生成多字符转义序列。幸运的是,curses模块将为您处理大部分工作;请看一下this example code

代码语言:javascript
运行
复制
#!/usr/bin/python

import curses

# get the curses screen window
screen = curses.initscr()

# turn off input echoing
curses.noecho()

# respond to keys immediately (don't wait for enter)
curses.cbreak()

# map arrow keys to special values
screen.keypad(True)

try:
    while True:
        char = screen.getch()
        if char == ord('q'):
            break
        elif char == curses.KEY_RIGHT:
            # print doesn't work with curses, use addstr instead
            screen.addstr(0, 0, 'right')
        elif char == curses.KEY_LEFT:
            screen.addstr(0, 0, 'left ')
        elif char == curses.KEY_UP:
            screen.addstr(0, 0, 'up   ')
        elif char == curses.KEY_DOWN:
            screen.addstr(0, 0, 'down ')
finally:
    # shut down cleanly
    curses.nocbreak()
    screen.keypad(0)
    curses.echo()
    curses.endwin()
票数 1
EN

Stack Overflow用户

发布于 2021-10-27 14:06:17

如果您的唯一目标是注册按键,sshkeyboard库可能是比curses库更好的选择,因为它使用起来更简单。但是,它不能处理绘制以显示。

安装:

代码语言:javascript
运行
复制
pip install sshkeyboard

对箭头做出反应:

代码语言:javascript
运行
复制
from sshkeyboard import listen_keyboard

def press(key):
    if key == "up":
        print("up pressed")
    elif key == "down":
        print("down pressed")
    elif key == "left":
        print("left pressed")
    elif key == "right":
        print("right pressed")

listen_keyboard(on_press=press)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65594459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档