标签完成无效

时间:2018-01-01 15:49:14

标签: python python-2.7 input windows-10 readline

我尝试使用制表符完成创建提示。我有两个文件。 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命令提示符下输出彩色文本。

1 个答案:

答案 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)。