^H^?用python

^H^?用python,python,backspace,Python,Backspace,一些终端将发送^?作为退格,其他一些终端将发送^H。 大多数终端可以配置为更改其行为。 我不想处理所有可能的组合,但我愿意接受^?和^H作为python的退格 这样做 我会接受第一个选择,并同意 os.system("stty erase '^H'") 我会接受第二个,但第一个将不再可用。 我想用 raw_input("userinput>>") 获取输入 我能弄明白的唯一方法是实现我自己的shell,它不是在“基于原始的输入”上工作,而是

一些终端将发送
^?
作为退格,其他一些终端将发送
^H
。 大多数终端可以配置为更改其行为。 我不想处理所有可能的组合,但我愿意接受
^?
^H
作为python的退格

这样做 我会接受第一个选择,并同意

os.system("stty erase '^H'")
我会接受第二个,但第一个将不再可用。 我想用

raw_input("userinput>>")
获取输入

我能弄明白的唯一方法是实现我自己的shell,它不是在“基于原始的输入”上工作,而是在“基于字符的输入”上工作


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

我不太清楚你的问题。在我看来,您需要一种从控制台到程序读取一些基于行的文本(包括一些特殊字符)的方法

无论您使用什么方法,如果在不同的控制台中读取此字符有特殊的含义,您应该面对一个控制台(不仅是系统特定的,而且是控制台特定的)问题,控制台中的所有文本将首先存储在缓冲区中,然后显示在屏幕上,最后处理并发送到您的程序。解决此问题的另一种方法是使用原始行获取控制台环境

您可以添加一个特殊的方法(decorator)来修饰原始输入(),或者添加一些输入方法来处理特殊的单词

在解决了那个问题之后

使用此代码段可以处理输入:

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

为了更快,可以根据操作系统调用一些系统功能。但事实上,python中的IO对于普通作业来说已经足够快了。

内置函数
raw\u input()
(或python 3中的
input()
)将在导入库后自动使用它。这为您提供了一个漂亮且全面的行编辑器,并且它可能是您在可用平台上的最佳选择,只要您不介意Readline拥有一个传染许可证(GPL)。

修复^?在erase do
stty erase ^H

您的目标平台是否提供GNU readline?是的,包含readline-6.2软件包,然后您应该使用此软件包而不是
raw\u input
,或者更准确地说,只需导入
readline
即可使
raw\u input()
自动使用它。有关如何重新绑定键等信息,请参阅。谢谢,我按照您的建议制作了…它非常有效。它似乎不会自动检测
^H
^?
,至少在带有
原始输入的终端上是如此。我正在打印原始
^H
字符。@ashgromnies:如果您有一个正确配置的终端和一个正确安装的GNU Readline版本,这种情况就不会发生。不幸的是,有太多的事情可能导致这种行为,以至于远程调试几乎是不可能的。@SvenMarnach我通过将“配置文件”菜单中退格的iTerm2键代码从
^H
更改为
^?
def pre():
    textline=raw_input()
    # ^? should replace to the specific value.
    textline.replace("^?","^H")
    return textline