python 脚本中的 'input' 函数在用户按回车键时在终端中显示回车 return 字符 (^M)

'input' function in python script shows carriage return character (^M) in terminal when user presses enter

脚本应将 'enter' 视为发送用户字符串,但它只是将“^M”打印到终端。

我不确定为什么会突然发生这种情况,这不是昨天发生的。这个特定的终端会话发生了一些变化,因为如果我打开一个新终端 window 它会按预期工作。

有什么想法吗?

我在 Mac(xterm?)

上使用 iterm

TL;DR:每当终端开始表现得滑稽时,只需在 OS shell 上键入 reset 命令。

终端仿真器程序(如 iterm)具有复杂的内部状态,以便提供字面上 十年 的功能,以允许在终端上运行更漂亮的程序。

终端最初是键盘,可以将键入的文本物理打印到纸上,回到大型机时代 - 以及“stdin”和“stdout”概念:一个流向前处理所有键入的数据,另一个流处理所有数据打印出来的,直到今天,50 多年后,与文本终端交互的默认方式。

以不同方式处理终端的程序的内部状态更改(例如无需等待“输入”即可读取按键)应该在程序终止时恢复。但由于错误和错误,情况并非总是如此。

我不知道哪个 possible 状态会更改显示“^M”,而不是将 CR 代码应用于终端。还有数十或数百个其他 possible 不当行为,包括完全弄乱所有角色。现代 *nixes(MacOS、Linux、BSD)中的 reset 命令将修复所有问题。

虽然,当然,如果没有应用“enter”,os根本不可能从 os shell 发出命令。然后你将不得不开始一个新的终端会话。在 Python 程序中,如果您碰巧调用了一些总是会破坏终端的代码,您可以 运行 通过调用 os.system('reset').[= 将其“重置”为子进程。 13=]

特别是,“^M”代表“ctrl + M”,它是一个控制字符,值为“13”(十六进制为 0x0d)。它是“Carriage Return”控制代码(又名“return”、“enter”、“CR”)的值。如果您从未这样做过:尝试按“ctrl+M”,看看它的行为与“enter”相同。它以“人类可读的形式”显示,而不是在您的案例中充当控制字符。

(关于 xterm 和 iterm:它们的共同点是它们都是“终端仿真器”程序,xterm 是现存最古老的此类程序之一,它可能率先对纯文本视频模式进行了大量改编到图形环境。“iterm”只是一个实现终端功能的普通现代应用程序)