[英]How to do a multi-level CLI in Python?
我正在尝试使用CLI编写,最好用Python编写。 我需要一个多级CLI,我想要标签完成。
我查看了cmd模块(来自Python标准库)和readline以及“完整”功能(用于标签完成)。
他们都缺乏某些东西,即我还没弄清楚如何处理多个级别,例如:
level1
level2
level2_subcommand_1
level2_subcommand_2
level3
level3_subcommand_1
示例:如果我输入:
cmd> level2
,我想看到当我按Tab键时出现level2_subcommand_1和level2_subcommand_2,但是没有level1而没有level3。
我无法使用cmd lib以及readline这样做。
使用Python 2.6.5中的cmd
模块,它对我来说非常好。 这是我用来测试这个的示例代码:
import cmd
class MyInterpreter(cmd.Cmd):
def do_level1(self, args):
pass
def do_level2_subcommand_1(self, args):
pass
def do_level2_subcommand_2(self, args):
pass
def do_level3_subcommand_1(self, args):
pass
MyInterpreter().cmdloop()
当我在命令行上键入“level2”然后按Tab键时,该行将扩展为level2_subcommand_
因为这是所有完成提议的公共前缀。 当我再次按Tab而不键入任何内容时,下一行正确显示level2_subcommand_1
和level2_subcommand_2
。 这是你想要的?
子命令的另一种变体是为它们创建一个子解释器:
class SubInterpreter(cmd.Cmd):
prompt = "(level2) "
def do_subcommand_1(self, args):
pass
def do_subcommand_2(self, args):
pass
def do_quit(self, args):
return True
do_EOF = do_quit
class MyInterpreter(cmd.Cmd):
def do_level1(self, args):
pass
def do_level2(self, args):
sub_cmd = SubInterpreter()
sub_cmd.cmdloop()
def do_level3(self, args):
pass
上面的变体为您的“主”解释器提供了level1
, level2
和level3
。 当您在主解释器中调用level2
时,它会构造子解释器并调用其命令循环。 子解释器与主解释器有不同的提示,因此您可以随时告诉您所在的解释器。然后, subcommand_2
解释器会为您提供subcommand_1
, subcommand_2
, subcommand_3
并quit
。 quit
将您带回主翻译,EOF角色也是如此。
来自pypi的argpext模块实现了命令行界面的多级子命令。 标签完成没有支持(但是?)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.