- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我的代码。
def getch():
fd = sys.stdin.fileno()
old_Settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
sys.stdin.flush()
except KeyboardInterrupt:
print ("[Error] Abnormal program termination")
finally:
termios.tcsetattr(fd,termios.TCSADRAIN,old_settings)
return ch
在此代码中,KeyboardInterrupt 异常不起作用。
谢谢
最佳答案
是的,当您将 TTY 设置为原始模式时——或者,特别是当您禁用 termios
时设置 ISIG
——你不再得到相应的行为:
ISIG When any of the characters INTR, QUIT, SUSP, or DSUSP are
received, generate the corresponding signal.
换句话说,字符 INTR
,在大多数终端中也称为 ^C
,不再生成 SIGINT
信号,is what Python uses to raise a KeyboardInterrupt
.
这就是像 emacs
这样的全屏程序可以使用 ^C
作为控制字符而不只是退出的方式。
所以,有两种选择:
不要调用 setraw
,而是设置您想要的一组确切的 termios
标志,确保不要禁用 ISIG
。
值得查看 Python 的 tty.setraw
的源代码看看它到底做了什么,用作基线。
如果没有 ISIG
,您也可以做同样的事情。但实际上,您应该阅读文档以了解其中每一项的含义。
并确保在你自己的系统上man termios
,不要上网搜索;在 Linux 和 macOS/*BSD 上有些不同,即使是同一操作系统的不同版本之间也存在细微差别。
即使阅读了文档并自己进行了试验,也可能并不完全清楚每个设置的效果。 This article似乎在解释进入原始模式的内容以及每个相关标志的实际含义方面做得不错(尽管我只是快速浏览了一下 - 而且。再次重申,您仍然需要阅读 man termios
以获得你的平台)。
或者,您可以手动处理 ^C
。
您已经使用 sys.stdin.read(1)
一次读取一个字符,因此当有人点击 ^C
时,您将读取'\x03'
字符。
当发生这种情况时,您可以做任何您想做的事情,包括raise KeyboardInterrupt
。
作为旁注,如果这是 Python 3,您可能希望以二进制模式阅读:
ch = sys.stdin.buffer.raw.read(1)
sys.stdin.flush()
(然后您将检查 b'\x03'
而不是 '\x03'
。当然。)
在文本模式下,您应该一次获得一个完整的字符,即使它是 UTF-8(或您的语言环境是什么)中的多字节字符。乍一看,这似乎更简单——但这实际上可能会产生误导,因为单个字符仍然可能只是击键的一部分。例如,对于大多数终端,向上箭头发送 3 个字符 ('\x1B[A'
),但
read(1)` 只会给您第一个字符。
关于python tty.setraw Ctrl + C 不起作用(getch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51509348/
我正在阅读The TTY demystified ,试图对 tty、pty 有一些了解。 读完前半部分。当我在 xterm 或 ssh 中输入一些命令时,我无法全面了解整个事情是如何工作的。 下图是我
假设我登录到终端 tty1,现在我想从 tty1 运行一个脚本,它会自动让我登录到 tty2、tty3、tty4。当然,我不想到处输入密码和用户名,因为我已经在 tty1 上进行了身份验证。 问题:如
为什么在我将 CentOS 作为 Docker 容器启动后,当我运行 tty 时,我得到: # tty not a tty 不是 tty 的原因是什么? 最佳答案 docker run 不会模拟 TT
我正在尝试通过 php 安装 composer,如他们的网站所述。 php -r "readfile('https://getcomposer.org/installer');" | php 但它显示
我正在运行一个 docker 容器并正在检查它。我发现 "Config": { "Hostname": "amb1.service.consul", "Domainname": "", "User":
我想用 2 个 xterm 窗口调试控制台 linux 应用程序:一个窗口用于 gdb,另一个用于应用程序(例如 mc)。 我现在要做的是在第二个 xterm 窗口中运行“tty && sleep 1
docker exec -it 命令返回以下错误“无法在非 tty 输入上启用 tty 模式” level="fatal" msg="cannot enable tty mode on non tty
这是命令的输出: Step 5/7 : RUN ./vendor/bin/laravel new --force testapp ---> Running in dc92e378b12a Craft
请帮助 MySQL Git Bash winpty mysqldump。 “winpty mysqldump”在 Git Bash 中不工作。这里是错误的详细信息: Git 狂欢 $ winpty m
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我一直在试图弄清楚 TTY 驱动程序是如何工作的(充分理解每个内核的实现可能不同),并且偶然发现了一篇不错的文章:The TTY demystified 但是我注意到它声称 xterm 没有 stdi
我正在使用 fork() 和 execvp() 来生成一个进程,该进程必须相信它已连接到交互式终端才能正常运行。 生成后,我想捕获进程的所有输出,并能够将输入发送到进程。 我怀疑 psuedo-tty
我在 ReactJs + 样式组件中遇到这个错误。我该如何解决? Compiled with problems: ERROR in ./node_modules/colorette/index.js
我在 ReactJs + 样式组件中遇到这个错误。我该如何解决? Compiled with problems: ERROR in ./node_modules/colorette/index.js
你好,这是我的脚本: import sys import LED import os import subprocess if __name__ == '__main__': LED_BLUE
我有几个问题。一,如何确定程序使用的 TTY,然后将其作为参数传递给另一个程序? 此外,我正在使用 writevt 程序,并将字符串发送到 TTY 设备。它工作正常,但不使用我发送它的回车符。所以,我
我想从内核空间写入 tty,并且只能访问该特定 tty 的主要和次要设备号。 我通过系统调用进入内核,该系统调用工作正常,并且能够通过使用写入当前 tty my_tty = current->sign
我最近注意到我的系统(运行在 AT91SAM9G15 上)有一个非常奇怪的行为:尽管我一直在读取串行端口,但 TTY 驱动程序有时需要 1.2 秒才能从输入队列传送数据。事情是:我没有丢失任何数据,只
我在没有屏幕的硬件上运行 linux,并将所有数据转储到串口。我正在通过 hyperterm 或 teraterm 等应用程序阅读 linux 序列。我得到了正确格式化的串行输出。但是,如果我将该输出
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我是一名优秀的程序员,十分优秀!