Python中的^H ^?

5 投票
3 回答
6784 浏览
提问于 2025-04-17 10:54

有些终端会把 ^? 当作退格键发送,而有些终端则会发送 ^H。大多数终端都可以设置来改变它们的行为。我不想去处理所有可能的组合,但我希望在 Python 中能同时接受 ^?^H 作为退格键。

这样做

os.system("stty erase '^?'")

我会接受第一个选项,使用

os.system("stty erase '^H'")

我会接受第二个选项,但第一个就不再可用了。我想用

raw_input("userinput>>")

来获取输入。

我能想到的唯一办法就是自己实现一个 shell,这个 shell 不是基于“原始输入”,而是基于“字符输入”。

有没有更好(更快)的主意?

3 个回答

0

要解决在删除时出现的 ^? 问题,可以使用命令 stty erase ^H

0

我不太清楚你的问题具体是什么。不过我觉得,你需要一个方法来从控制台读取一些基于行的文本(包括一些特殊字符)到你的程序中。

不管你用什么方法,如果读取的字符在不同的控制台中有特殊含义,你就会遇到一个控制台的问题(不仅仅是系统特定的,还有控制台特定的)。所有在控制台中的文本首先会存储在一个缓冲区中,然后再显示在屏幕上,最后处理后发送到你的程序中。解决这个问题的另一种方法是使用一个原始的行获取控制台环境。

你可以给raw_input()或者其他输入方法添加一个特殊的方法(装饰器),来处理这些特殊的词。

解决了这个问题后,

使用下面的代码片段可以处理输入:

def pre():
    textline=raw_input()
    # ^? should replace to the specific value.
    textline.replace("^?","^H")
    return textline

如果想要更快,可能根据操作系统调用一些系统函数是个好主意。但实际上,Python中的输入输出对于一般的工作来说已经足够快了。

5

内置的函数 raw_input()(在 Python 3 中是 input())在导入后会自动使用 readline 库。这个库提供了一个功能丰富的行编辑器,如果你在支持这个库的平台上使用它,这通常是个不错的选择,只要你不介意 Readline 的许可证是传染性的(GPL)。

撰写回答