在Python中读取stdin时对关键事件作出反应 安装程序

在Python中读取stdin时对关键事件作出反应 安装程序,python,pipe,stdin,keypress,Python,Pipe,Stdin,Keypress,我一直在玩一个脚本,将tail-f导入并突出显示某些关键字。这不是一个大项目,但我发现有些东西很有用 现在主要的循环基本上是: ... line = True while line: line = sys.stdin.readline() sys.stdout.write(highlight(line)) ... 我想在这个循环中听一些按键来打印日志中的标记线。上面描述了我发现的获取按键的方法,但是它一次只能从stdin中读取一个字符,而当我的主循环从stdin中读取整行内容时

我一直在玩一个脚本,将
tail-f
导入并突出显示某些关键字。这不是一个大项目,但我发现有些东西很有用

现在主要的循环基本上是:

...
line = True
while line:
    line = sys.stdin.readline()
    sys.stdout.write(highlight(line))
...
我想在这个循环中听一些按键来打印日志中的标记线。上面描述了我发现的获取按键的方法,但是它一次只能从stdin中读取一个字符,而当我的主循环从stdin中读取整行内容时,它就不起作用了

问题: Python中有没有一种方法可以在读取管道输入的同时监听按键

我将主函数包装在一个
try
块中,除了
KeyboardInterrupt
之外,它还打印了一条漂亮的告别消息,而不是错误堆栈跟踪。有没有一种方法可以通过另一个键来实现这种行为


我不想使用像pygame或tkinter这样的强大(与我的小脚本相比)模块,而是被迫使用它们的主循环来访问按键。(另外,我不知道两种方法在接收管道输入时的行为)

最简单的解决方案是完全避免使用来自尾部的管道。坚持使用stdin进行用户输入,而不是编写工具,这样它就可以打开并跟踪本机读取的文件,而不必使用tail。如果您只想重新实现tail的这一部分,那么tail并不是一个非常复杂的工具

或者,您可以创建一个允许您通过管道将尾部插入其中的文件,然后您的程序可以像读取文件一样读取它,并且仍然可以访问自己的stdin

如果这两个都不是选项,我认为使用单独的库直接轮询键盘可能是最好的选择。作为记录,pygame实际上没有“主循环”,它有一个事件泵函数,你应该尽可能经常调用(在你的主循环中),但如果你没有,它不会死。它可以在泵之间缓冲大量的事件,您可以在泵上设置过滤器以丢弃所有您不关心的事件,只保留您关心的事件(按键)。pygame的主要问题是,它是一个相当重的库,需要这样一个简单的工具,所以我理解你对这条路线的犹豫


哦,作为最后一个选择(在我看来,这是最不可取的),你可以滥用键盘中断机制来创建“类似Emacs”的键和弦。比如,按Ctrl-C,然后按Ctrl-(无论什么)。Ctrl-C调用键盘中断,然后在处理程序中读取stdin中的下一个字符,并对其进行处理。完成后,返回循环。但这很难看,很粗糙,我甚至不确定它是否能可靠地工作。

在我调查之前,我从未见过命名管道。也感谢你对pygame的澄清。我之所以想使用管道输入,是为了让你可以使用它快速突出显示任何内容。实际上,我已经将它设置为在
--
使用
popen
之后执行您传递给它的任何命令,然后使用它的输出。我希望允许管道输入,以及多功能性。你可能想看看。
curses
模块似乎可以用比pygame小得多的内存访问键盘。