python获取没有ctrl字符的输入(^)

时间:2014-09-17 22:36:16

标签: python

我正在尝试将用户输入到python中。但是,如果用户使用[Home]或Ctrl + A或Ctrl + k(典型的shell命令)等键,则会获得表示该键而不是预期行为的字符。

我目前有:

data = input("Enter your data here: ").strip()

但是,如果用户使用Ctrl + A转到行首,则会在屏幕上打印^A个字符作为输入的一部分。

我是否有办法以允许用户使用Ctrl + A等bash键组合的方式获取输入?

1 个答案:

答案 0 :(得分:2)

简短版本只是将import readline添加到您的脚本顶部,它将神奇地工作。

更具体地说,readline库提供了一个libreadline的包装器,它是允许你的bash shell或者Python交互式解释器实现这个问题的库。输入编辑。

因此,可以直接使用readline。如果您想做任何奇特的事情,您应该阅读文档,另请参阅rlcompleter

但是对于像这样的简单案例:默认情况下,只为您导入readline(实际上)补丁input,*这就是您所需要的。

因此,假设用户(及其发行版)使用默认设置,他们将能够使用他们在bash中使用的相同emacs风格的击键。 (并且,如果他们已经更改了设置,可能他们希望能够在您的程序中使用这些设置,而不仅仅是在bash中。)


唯一的问题是,只有在构建Python时出现libreadline时,这才有效:

  • 在大多数Linux和* BSD系统上,这不是问题。**
  • 在OS X上,它成为一个问题,但Python提供了一种使用BSD libedit的解决方法,而不是Apple包含的。***
  • 在Windows上,如果您在正常的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,则会失败。