Python cmd模块中的标签自动补全和子命令简单实现?

2 投票
1 回答
1011 浏览
提问于 2025-04-18 10:34

在Python的Cmd类中,能不能给子命令添加Tab键自动补全功能呢?比如说,我在运行我的命令循环时,想要有一个叫做add的命令,然后可以选择动物名字,比如add horse或者add elephant。如果可能的话,我该怎么为这些子命令实现Tab键自动补全呢?

我在实际项目中做的一件事是为不同的模式使用不同的类。如果你输入whitelist,它会在那个类中运行另一个命令循环,这时就进入了“whitelist”模式。你可以输入exit来返回主命令循环。这样做对于一些复杂的模式来说似乎不错,但为了像上面那样简单地添加不同类型的东西,创建一个继承Cmd的新类似乎有点过于复杂。那么,有什么更简单的方法可以为Cmd类添加可以自动补全的子命令呢?谢谢。

1 个回答

4

下面的代码可以正常运行:

#!/usr/bin/env python


from __future__ import print_function


from cmd import Cmd
import readline  # noqa


class Zoo(Cmd):

    def __init__(self, animals):
        Cmd.__init__(self)

        self.animals = animals

    def do_add(self, animal):
        print("Animal {0:s} added".format(animal))

    def completedefault(self, text, line, begidx, endidx):
        tokens = line.split()
        if tokens[0].strip() == "add":
            return self.animal_matches(text)
        return []

    def animal_matches(self, text):
        matches = []
        n = len(text)
        for word in self.animals:
            if word[:n] == text:
                matches.append(word)
        return matches


animals = ["Bear", "Cat", "Cheetah", "Lion", "Zebra"]
zoo = Zoo(animals)
zoo.cmdloop()

撰写回答