Python中避免readline的跨平台向raw_input插入文本的方法
我有一个应用程序(命令行界面),它可以编辑账户信息。这个功能是通过提问的方式实现的,问题中会显示旧的值,这样用户就可以直接修改。现在我使用的是 readline
模块来完成这个功能。不过,我想找一种不依赖这个模块的方法,这样我的应用就可以在所有支持 Python 的操作系统上运行,而不仅仅是 Windows 或 GNU/Linux。
我最开始在一个网站上找到了一段代码(我稍微修改了一下,让它适合放进一个函数里),但是那个讨论已经有四年了,所以我想在这里问问大家。 http://bytes.com/topic/python/answers/471407-default-editable-string-raw_input
import readline
def editInput(question, old_value):
readline.set_startup_hook(lambda: readline.insert_text(old_value))
try:
new_value = raw_input(question)
finally:
readline.set_startup_hook(None)
return new_value
editInput('What\'s the answer? ', '32')
更新:我并不一定需要 readline 的替代品(比如 PyReadline)。我只需要得到同样的效果。我更新了问题,说明我并不一定需要在 Windows 和 GNU/Linux 上运行,而是希望能在任何支持 Python 的操作系统上运行。所以基本上,只需要使用一些非常基础的功能(比如 sys.stdin 等等)。
2 个回答
为什么不使用 PyReadline 呢?它被 IPython 用来实现差不多相同的功能,并且得到了很好的支持。
其实,算了。我刚试了一下,发现它不管用。可能是因为 pyreadline 不支持 set_startup_hook
这个功能。
实现行编辑功能并不是一件简单的事情。举个例子,像“读取下一个按键但不显示出来”这样的功能(在你开始理解这个按键的意思之前,比如移动光标、改变屏幕上显示的内容,以及编辑的文本行的记忆内容)就不能简单地在不同操作系统上实现:在Windows上你需要用到msvcrt
,而在类Unix系统上则需要用到curses
。而且你希望它能在Python支持的任何操作系统上都能工作,这个要求就显得非常庞大,几乎不可能满足。
在考虑答案之前,你需要非常明确地限定一下必须运行的操作系统/平台的范围,以及它必须提供的行编辑功能的子集。如果你无法明确这些范围,那么答案就很简单:你所要求的功能,因为过于笼统,实际上是根本不可能实现的。