Он отлично работает для меня с модулем cmd
в Python 2.6.5.Вот пример кода, который я использовал для проверки этого:
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_1
, subcommand_2
, subcommand_3
и quit
.quit
возвращает вас к основному интерпретатору, как и символ EOF.