Как сделать интерфейс командной строки или интерпретатор в Python - PullRequest
5 голосов
/ 12 октября 2010

ребята.Я видел некоторые вопросы CLI здесь, но я все еще хочу задать этот вопрос для более подробных ответов.

Я уже разработал class1.py, class2.py и т. Д. С функциями, реализованными внутри каждого класса.Например, Operator.py имеет функции добавления, минуса, времени, деления.Как я могу построить интерфейс командной строки для этих классов?

также для этого CLI, это бесконечный цикл внутри main () для взаимодействия?

И как CLI может дать некоторую обратную связь, например, предложить пользователю следующую операцию или ввести правильную команду или ввести --help и проверить все доступные команды.как раковины Баш.

также кажется, что есть модуль optparse от python.Есть ли хорошие, полные или высококачественные образцы, показывающие, как создается CLI?Я хотел бы воспользоваться этой возможностью, чтобы узнать, как написать программу на CLI.

Я хочу: я уже разработал несколько классов, а также графический интерфейс для вызова методов из этих классов.Теперь я хочу иметь CLI, такой как GUI, чтобы использовать эти классы.Например, у меня есть классы, такие как CDContainer (с методом, подобным addCD, removeCD и т. д.), CD (с методом, подобным play, stop, pause), и у меня есть графический интерфейс, с которым можно взаимодействовать.Теперь я хочу иметь CLI, который в bash, я мог бы запустить этот CLI и вызывать команды createCDContainer, addCD, removeCD.

Если я использую cmd,

class CDContainerCLI(cmd.Cmd):

    def do_CDContainer(self, line):
        print "create CD container"

    def do_addcd(self, line):
        print "add cd into the container"

как мнедобавить несколько вариантов здесь?Например, я хочу добавить триллер addcd --track 3 --cdname Я думаю, что «--track 3 - триллер cdname» - это 4 аргумента для функции addcd.как это реализовать?

Ответы [ 5 ]

5 голосов
/ 12 октября 2010

Получите из cmd.Cmd, переопределяя различные методы при необходимости.

2 голосов
/ 12 октября 2010
1 голос
/ 12 октября 2010

Я не уверен, что вы ищете: кажется, вы хотите создать интерактивную оболочку, но вы также упомянули optparse, которая предназначена для упрощения создания интерфейса модуля, который можно запустить из системной оболочки вместо предоставления самой оболочки.

Похоже, вы хотите, чтобы ваш модуль реализовал собственную интерактивную оболочку, но, возможно, вы также хотите иметь некоторые команды, доступные из командылиния, например, позвонив your_script the_command --argument value --other-argument прямо с bash или что у вас есть.Это то, что optparse предназначено для обеспечения, но оно устарело в пользу argparse.argparse находится в стандартной библиотеке Python 2.7 и может быть установлен стандартным способом (например, в зависимости от вашего модуля или отдельной установкой через PyPI и т. Д.) Для более старых Pythons.

argparse делает относительно простым связывание определенных опций или подкоманд с точками входа (т.е. вызовами функций) в вашем коде.Документация довольно подробная, и ее стоит внимательно прочитать, если вы захотите создать несколько таких интерфейсов.Для расширенного использования вы можете сделать некоторые интересные вещи и сделать свой код немного более управляемым, создав пользовательское действие .

1 голос
/ 12 октября 2010

Используйте модуль cmd:

Другие пакеты

Вы также можете использовать различные модули, размещенные на pypi, который построен поверх модуля cmd

0 голосов
/ 16 декабря 2010

Я думаю, что он спрашивает о том, как легко справиться с необязательными аргументами в интерактивной оболочке, поэтому при использовании программы она будет выглядеть примерно так:

$ myprogram
(Cmd) addcd --track 3 --cdname thriller

Таким образом, запуск myprogram открывает собственную командную строку, в которую можно вводить такие команды, как addcd, а также необязательные аргументы и затем обрабатывать их.

На мой взгляд, лучший способ сделать это - использовать argparse вместе с cmd.Вместо разбора sys.argv, методу parse_args можно передать список строк.Итак, что-то вроде ниже:

def do_addcd(self, line):
    parser = argparse.ArgumentParser(prog='addcd')
    parser.add_argument('--track', type=int)
    parser.add_argument('--cdname')

    args = parser.parse_args(line.split())
    newcd = CD(args.track, args.cdname)

Проблема с выполнением чего-то подобного, как я сам обнаружил, пытаясь делать именно такие вещи, заключается в том, что parse_args имеет тенденцию выходить из всей программы, еслисреди прочих ошибок вы указываете неверное количество аргументов.Желаемое поведение в этом случае использования - просто выйти обратно в пользовательскую интерактивную оболочку, но это будет нелегко сделать без какого-либо хакерского обходного пути или подкласса ArgumentParser и переопределения parse_args.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...