我正在开发一个Python脚本,它有时需要用户输入输入。我在macOS Sierra上使用bash。
为了接收输入,我写了以下内容:

import readline  # gnureadline 6.3.8

START = '\033[91m\033[1m'
END = '\033[0m'

response = raw_input(START + 'Enter text: ' + END)

我使用STARTEND中的ANSI转义序列来直观地区分脚本的提示和用户的文本条目。
不幸的是,一旦我开始输入文本,程序就会失去用户输入文本的开始位置。下面的第一克拉是CTRLA现在的地图,第二克拉是CTRLE带我去的地方。箭头键同样认为用户输入的开始和结束是偏移的,如图所示。
Enter text: hello my name is
                         ^               ^

我试了一些东西来调试这个。
我试着在提示符和文本条目之间加一个新行,但这只会使偏移量更糟。
如果我只使用箭头键,而不使用CTRLA、CTRLE、option arrow这样的东西来导航字符串,那么这将按预期工作。也就是说,考虑到用户输入的字符串的长度和复杂性,只使用箭头键移动字符串会对用户造成痛苦。
最重要的是,如果我根本不使用STARTEND,那么这个方法就非常有效。也就是说,脚本的可用性下降了——很难从这个脚本的完整版本中经过的所有其他文本中找出提示。
有没有什么诀窍可以让我使用ANSI转义序列来格式化提示,而不影响用户使用CTRLA、CTRLE和选项箭头导航的能力?谢谢您!

最佳答案

分别打印提示和请求输入两个命令。
巨蟒3.x

print(START + 'Enter text: ' + END, end='')
response = input()

巨蟒2.x
import sys

# Use sys.stdout.write to avoid printing a trailing newline.
sys.stdout.write(START + 'Enter text: ' + END)
response = raw_input()

10-06 05:05