我尝试使用制表符完成创建提示。我有两个文件。 main.py和prompt.py。 main.py导入prompt.py并运行prompt.py的main()
函数。 main()
函数使用readline设置制表符完成符并反复等待用户输入。它打印输入的内容,并且应该根据COMMANDS列表中的任何文本完成选项卡完成。
main.py:
import prompt
prompt.main()
prompt.py:
import readline
import colorama
colorama.init()
COMMANDS = ['qwerty','uiop','asdf','ghjkl']
def complete(text, state):
for cmd in COMMANDS:
if cmd.startswith(text):
if not state:
return cmd
else:
state -= 1
def main():
readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
while True:
test_input=raw_input(':')
print test_input
main()
当我按下标签按钮时,程序会尝试自动完成命令列表中的任何内容。所以,如果我输入" qwe"然后按Tab键程序选项卡完成" qwerty"。但是当我按下程序中的tab时,没有任何反应。
在对colorama.init()
行进行评论后,代码现在可以自动完成了。因此,行colorama.init()
正在影响制表符的完成。为什么会这样?如何在不影响选项卡的情况下运行该行,因为我需要colorama模块在Windows命令提示符下输出彩色文本。
答案 0 :(得分:0)
问题是readline
使用等效于sys.__stdout__
的标准输出流来控制终端。
但是,当您调用colorama.init()
时,Python的默认流sys.stdout
被重定向到colorama
自己的包装器中。
readline
然后将不再看到纯净的标准输出并且无法运行。值得注意的是,colorama
剥离了readline
使用的特殊转义码。
如果您手动重定向sys.stdout
,例如应用您自己的格式或将输出发送到GUI,也会发生此问题。
在所有情况下,解决方案都是在任何sys.stdout
的时间内将sys.__stdout__
恢复为默认的input
,例如通过以下方式进行
original_stdout = sys.stdout
sys.stdout = sys.__stdout__
foo = input()
sys.stdout = original_stdout
请注意,colorama
的与操作系统无关的着色功能现在在此input
期间不起作用,因此,如果要在输入提示中输入颜色,则必须分支并进行相关的转义分别要求您支持的平台(Windows / Unix)。