Python cmd自动完成:在单独的行上显示选项

Python cmd自动完成:在单独的行上显示选项,python,command-line-interface,readline,python-cmd,Python,Command Line Interface,Readline,Python Cmd,我正在使用cmd模块用Python编写CLI,它使用readline模块提供自动完成功能。 Autocomplete在同一行上显示不同的选项,而我希望它们在不同的行上,我在cmd中没有找到允许我这样做的任何参数 这是一个示例程序: import cmd 类mycmd(cmd.cmd): 定义初始化(自): cmd.cmd.\uuuu init\uuuuu(自) def do_退出(自我): 返回真值 def do_添加(自身): 通过 def do_添加(自身): 通过 def complete

我正在使用cmd模块用Python编写CLI,它使用readline模块提供自动完成功能。 Autocomplete在同一行上显示不同的选项,而我希望它们在不同的行上,我在cmd中没有找到允许我这样做的任何参数

这是一个示例程序:

import cmd
类mycmd(cmd.cmd):
定义初始化(自):
cmd.cmd.\uuuu init\uuuuu(自)
def do_退出(自我):
返回真值
def do_添加(自身):
通过
def do_添加(自身):
通过
def complete_add(self、text、line、begidx、endidx):
参数=['asd','asdasd','lol']
如果s.startswith(text)则返回参数中s的[s]
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
mycmd().cmdloop()
这就是结果:

(Cmd) <tab> <tab>
add       addition  help      quit   <-- I want these on different lines
(Cmd) add<tab> <tab>
add       addition                   <-- 
(Cmd) add <tab> <tab>
asd     asdasd  lol                  <-- 
(Cmd) add asd<tab> <tab>
asd     asdasd                       <-- 
(Cmd)

添加添加帮助退出您需要接管readline的显示功能来完成此操作。为此,
import readline
,将其添加到您的
\uuuu init\uuuu

        readline.set_completion_display_matches_hook(self.match_display_hook)
并将其添加到您的类中:

    def match_display_hook(self, substitution, matches, longest_match_length):
        print()
        for match in matches:
            print(match)
        print(self.prompt, readline.get_line_buffer(), sep='', end='', flush=True)

非常感谢,这很有效。我已经编辑了答案以添加Python2的解决方案,因为您的代码只适用于Python3。@Amedeo我不喜欢这样。Python2是EOL,因此使用它不再安全,我不想让人们更容易做错事。我明白你的意思。但是,在您没有选择的情况下,使用遗留系统可能会发生这种情况(不幸的是,这是我的情况)。无论如何,这是你的答案:)
    def match_display_hook(self, substitution, matches, longest_match_length):
        print()
        for match in matches:
            print(match)
        print(self.prompt, readline.get_line_buffer(), sep='', end='', flush=True)