Внедрение интерфейса командной строки ?

Что такое «самый чистый» способ реализации интерфейса командной строки, например, git's, например:

git push origin/master git remote add origin git://example.com master 

В идеале, также, что позволяет более гибкое разбор, например,

 jump_to_folder app theappname v2 jump_to_folder app theappname source jump_to_folder app theappname source v2 jump_to_folder app theappname build v1 jump_to_folder app theappname build 1 jump_to_folder app theappname v2 build 

jump_to_folder – это имя скрипта, app – это команда, theappname является параметром «фиксированного местоположения», «build» и «v2» и т. д. являются аргументами (например, возможными аргументами могут быть любое число / любое число, префиксное av или build / источник / TMP / конфигурации)

Я мог бы просто вручную проанализировать аргументы с помощью ряда if / else / elifs , но должен быть более элегантный способ сделать это?

В качестве полностью теоретического примера я мог бы описать схему пользовательского интерфейса.

 app: fixed: application_name optional params: arg subsection: "build" "source" "tmp" "config" arg version: integer "v" + integer 

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

 >>> print schema.parse(["app", "theappname", "v1", "source"]) { "application_name": "theappname", "params":{ "subsection": "source", "version":"v1" } } 

Существует ли такая система? Если нет, как бы я мог реализовать что-то в этом направлении?

6 Solutions collect form web for “Внедрение интерфейса командной строки ?”

Модуль cmd , вероятно, будет хорошо работать для этого.

Пример:

 import cmd class Calc(cmd.Cmd): def do_add(self, arg): print sum(map(int, arg.split())) if __name__ == '__main__': Calc().cmdloop() 

Запустить его:

 $python calc.py (Cmd) add 4 5 9 (Cmd) help Undocumented commands: ====================== add help (Cmd) 

Дополнительную информацию см. В документах Python или на сайте PyMOTW .

argparse идеально подходит для этого, в частности « подкоманды » и позиционные аргументы

 import argparse def main(): arger = argparse.ArgumentParser() # Arguments for top-level, eg "subcmds.py -v" arger.add_argument("-v", "--verbose", action="count", default=0) subparsers = arger.add_subparsers(dest="command") # Make parser for "subcmds.py info ..." info_parser = subparsers.add_parser("info") info_parser.add_argument("-m", "--moo", dest="moo") # Make parser for "subcmds.py create ..." create_parser = subparsers.add_parser("create") create_parser.add_argument("name") create_parser.add_argument("additional", nargs="*") # Parse opts = arger.parse_args() # Print option object for debug print opts if opts.command == "info": print "Info command" print "--moo was %s" % opts.moo elif opts.command == "create": print "Creating %s" % opts.name print "Additional: %s" % opts.additional else: # argparse will error on unexpected commands, but # in case we mistype one of the elif statements... raise ValueError("Unhandled command %s" % opts.command) if __name__ == '__main__': main() 

Это можно использовать так:

 $ python subcmds.py create myapp v1 blah Namespace(additional=['v1', 'blah'], command='create', name='myapp', verbose=0) Creating myapp Additional: ['v1', 'blah'] $ python subcmds.py info --moo usage: subcmds.py info [-h] [-m MOO] subcmds.py info: error: argument -m/--moo: expected one argument $ python subcmds.py info --moo 1 Namespace(command='info', moo='1', verbose=0) Info command --moo was 1 

Прямо от одного из моих сценариев:

 import sys def prog1_func1_act1(): print "pfa1" def prog2_func2_act2(): print "pfa2" commands = { "prog1 func1 act1": prog1_func1_act1, "prog2 func2 act2": prog2_func2_act2 } try: commands[" ".join(sys.argv[1:])]() except KeyError: print "Usage: ", commands.keys() 

Это довольно быстрое и грязное решение, но отлично подходит для моего использования. Если бы я немного почистил его, я бы, вероятно, добавил argparse в микс для парсинга позиционных и ключевых слов.

Python имеет модуль для анализа параметров командной строки, optparse .

Возможно, вы захотите взглянуть на платформу Cliff – Command Line Interface Formulation Framework

Вот мое предложение.

  1. Измените свою грамматику немного.

  2. Используйте optparse.

В идеале, также, что позволяет более гибкое разбор, например,

 jump_to_folder -n theappname -v2 cmd jump_to_folder -n theappname cmd source jump_to_folder -n theappname -v2 cmd source jump_to_folder -n theappname -v1 cmd build jump_to_folder -n theappname -1 cmd build jump_to_folder -n theappname -v2 cmd build 

Тогда у вас есть 1 или 2 аргумента: команда всегда является первым аргументом. Это необязательный аргумент – это всегда второй аргумент.

Все остальное – это варианты, в определенном порядке.

Python - лучший язык программирования в мире.