我正在尝试将用户输入到python中。但是,如果用户使用[Home]或Ctrl + A或Ctrl + k(典型的shell命令)等键,则会获得表示该键而不是预期行为的字符。
我目前有:
data = input("Enter your data here: ").strip()
但是,如果用户使用Ctrl + A转到行首,则会在屏幕上打印^A
个字符作为输入的一部分。
我是否有办法以允许用户使用Ctrl + A等bash键组合的方式获取输入?
答案 0 :(得分:2)
简短版本只是将import readline
添加到您的脚本顶部,它将神奇地工作。
更具体地说,readline
库提供了一个libreadline
的包装器,它是允许你的bash
shell或者Python交互式解释器实现这个问题的库。输入编辑。
因此,可以直接使用readline
。如果您想做任何奇特的事情,您应该阅读文档,另请参阅rlcompleter
。
但是对于像这样的简单案例:默认情况下,只为您导入readline
(实际上)补丁input
,*这就是您所需要的。
因此,假设用户(及其发行版)使用默认设置,他们将能够使用他们在bash中使用的相同emacs风格的击键。 (并且,如果他们已经更改了设置,可能他们希望能够在您的程序中使用这些设置,而不仅仅是在bash中。)
唯一的问题是,只有在构建Python时出现libreadline
时,这才有效:
libedit
的解决方法,而不是Apple包含的。*** cmd.exe
" DOS框"内运行,您将自动获得DOS样式的行编辑,并且无法获得更好的效果。 ..但幸运的是,Windows用户不知道他们错过了什么。 :) *如果您想知道它是如何运作的,那么input
底层代码的设计巧妙地被readline
和IDLE所吸引,其方式为&# 39;足够灵活,你甚至可以做一些漂亮的事情,比如将它集成到asyncio
事件循环中。因此,readline
并非真正补丁input
;相反,它只是注册一个钩子。哪个很酷,值得一读,但与你的问题无关。
**如果是的话,除了安装libreadline
并重建Python之外,你无能为力。在* BSD上,我猜你可以配置Python来构建OS X libedit
包装器,但我不知道你为什么要打扰。 < / p>
***如果您使用的是Apple预先构建的Python或(直到最近)python.org,您将使用此解决方法。大多数应用程序和大多数用户都不会受到差异的影响,但可能会有一些烦恼。强制解决这些烦恼的方法是依赖于PyPI的readline
更新版本,如果您的用户尚未安装libreadline
,则会失败。