TAH*_*TAH 5 python bash ansi-escape
我正在编写一个 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)
Run Code Online (Sandbox Code Playgroud)
START我在和中使用 ANSI 转义序列END来直观地区分脚本的提示符和用户的文本输入。
不幸的是,一旦我开始输入文本,程序就会丢失用户输入文本的实际开头位置。下面的第一克拉是CTRLA现在映射到的位置,第二克拉是CTRLE我要去的地方。箭头键同样认为用户输入的开始和结束是偏移的,如图所示。
Enter text: hello my name is
^ ^
Run Code Online (Sandbox Code Playgroud)
我尝试了一些方法来调试这个。
我尝试在提示和文本输入之间添加换行符,但这只会使偏移量变得更糟。
如果我只使用箭头键而不使用诸如CTRLA、CTRLE、 选项箭头之类的东西来浏览字符串,那么这将按预期工作。也就是说,考虑到用户输入的字符串的长度和复杂性,仅使用箭头键在字符串中移动对于用户来说将是痛苦的。
最重要的是,如果我根本不使用STARTand ,这会完美地工作。END也就是说,脚本的可用性下降了——很难从完整版本的脚本中的所有其他文本中找出提示。
是否有一些技巧可以让我能够使用 ANSI 转义序列来格式化提示,而不会影响用户使用CTRLA、CTRLE和选项箭头进行导航的能力?
将提示和要求输入分开打印到两个命令中。
Python 3.x
print(START + 'Enter text: ' + END, end='')
response = input()
Run Code Online (Sandbox Code Playgroud)
Python 2.x
import sys
# Use sys.stdout.write to avoid printing a trailing newline.
sys.stdout.write(START + 'Enter text: ' + END)
response = raw_input()
Run Code Online (Sandbox Code Playgroud)