我正在使用cmd
模块,并有一个名为server
(方法do_server()
)的命令,该命令具有自动完成功能(我在macOS上)。一切都很好,并且按预期方式工作。但是,如果我还想在server
命令上使用一个子命令,那么事情就不会像我需要的那样进行。
我需要以下内容:
-子命令也应该与help
命令集成在一起(输入help
时不应显示,因为它们不是第一级命令,但输入help server
时应显示)
-子命令也应与自动完成功能集成
目前,我没有一种现成的定义子命令的方法。我需要将它们作为不理想命令的参数来实现。
我的问题是,我该如何使用help
实现子命令的自动文档并具有自动完成功能,以便它与cmd
尽可能地集成在一起?
对于此示例,我想更好地集成connect
作为子命令:
from cmd import Cmd
class Tansanit(Cmd):
def do_server(self, args):
""" Show server info """
print("Some server details")
if args and args == "connect":
print("Connect to the server")
def do_quit(self, args):
""" Quit CLI """
raise SystemExit
if __name__ == '__main__':
t = Tansanit()
t.prompt = "> "
t.cmdloop()
我希望有这样的东西:
from cmd import Cmd
class Tansanit(Cmd):
def do_server(self, args):
""" Show server info """
print("Some server details")
def do_server_connect(self, args):
""" Connect to server """
print("Connect to the server")
def do_quit(self, args):
""" Quit CLI """
raise SystemExit
if __name__ == '__main__':
t = Tansanit()
t.prompt = "> "
t.cmdloop()
不幸的是,这不可能。
答案 0 :(得分:0)
可以找到相关信息here
解释器能够处理命令名称的完成,但是对于命令参数,您将需要帮助。对于命令xxx,这是通过定义complete_xxx方法来完成的。例如,如果您定义了color命令,则该命令的完成方法可以是:
_AVAILABLE_COLORS = ('blue', 'green', 'yellow', 'red', 'black')
def complete_color(self, text, line, begidx, endidx):
return [i for i in _AVAILABLE_COLORS if i.startswith(text)]
complete_xxx方法采用四个参数:
text是我们要匹配的字符串,所有返回的匹配必须以它开头 line是当前输入行 begidx是要匹配的文本行中的开始索引 endidx是要匹配的文本行中的结束索引 它应该返回代表可能完成的字符串列表(可能为空)。当完成取决于参数的位置时,参数begidx和endidx很有用。
help
(用于子命令)您还可以为与命令无关的主题定义帮助:
def help_introduction(self):
print 'introduction'
print 'a good place for a tutorial'
这不是完美的,因为帮助将被归类为undocumented commands
,但这只是一个参数。但是也许再好不过了。