Как сделать многоуровневый CLI в Python? - PullRequest
5 голосов
/ 19 октября 2010

Я пытаюсь сделать CLI, желательно написанный на Python.Мне нужен многоуровневый интерфейс командной строки, и я хочу завершить вкладку.

Я посмотрел на модуль cmd (из стандартной библиотеки Python) и readline с функцией «complete» (для завершения табуляции).

Им обоим не хватало чего-то, т.е. я не понял, как обрабатывать несколько уровней, таких как:

level1
level2
    level2_subcommand_1
    level2_subcommand_2
level3
    level3_subcommand_1

Пример: если я набрал:

cmd> level2

, яхочу, чтобы level2_subcommand_1 и level2_subcommand_2 появлялись, когда я нажимал клавишу табуляции, но без уровня 1 и без уровня 3.

Мне не удалось сделать это с помощью библиотеки cmd, а также с readline.

Ответы [ 2 ]

11 голосов
/ 19 октября 2010

Он отлично работает для меня с модулем 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

Приведенный выше вариант дает вам level1level2 и level3 в вашем «основном» интерпретаторе.Когда вы вызываете level2 в вашем основном интерпретаторе, он создает суб-интерпретатор и вызывает его командные циклы.Подинтерпретатор имеет приглашение, отличное от основного, поэтому вы всегда можете определить, в каком интерпретаторе вы находитесь. Затем суб-интерпретатор выдаст вам subcommand_1, subcommand_2, subcommand_3 и quit.quit возвращает вас к основному интерпретатору, как и символ EOF.

0 голосов
/ 17 марта 2013

Модуль argpext от pypi реализует многоуровневые подкоманды для интерфейса командной строки. поддержка завершения табуляции отсутствует (пока?).

...