Как создать оболочку adb, похожую на парсер аргументов в python?

Команда adb shell am (диспетчер активности) имеет такие параметры:

 [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]

Насколько мне известно, argparse - это способ Python для анализа аргументов. Мне нужно действие, которое должно:

  • состоит из 2 или более аргументов (например, --eia key1 1 2 3) (см. последний пункт)
  • является необязательным
  • edit это может произойти несколько раз, например. --eia key1 1,2 --eia key2 2,1 действительно
  • тип первого аргумента может отличаться от типа остальных
  • другие необязательные аргументы, подобные этому, могут существовать
  • в примере есть разделитель ,, но я хотел бы разрешить разделять пробелами, потому что мои фактические значения аргументов могут быть строками, и я хотел бы оставить их синтаксический анализ в оболочке (если строка должна начинаться с -, кавычки помогите: "-asdf")

На другой вопрос есть ответ, который может сделать это с позиционными аргументами:

parser = argparse.ArgumentParser(usage='%(prog)s [-h] file file [file ...]')
parser.add_argument('file1', nargs=1, metavar='file')
parser.add_argument('file2', nargs='+', metavar='file', help=argparse.SUPPRESS)
namespace = parser.parse_args()
namespace.file = namespace.file1 + namespace.file2

Но я не вижу, работают ли они и для необязательных аргументов?

С моими требованиями стоит ли вообще начинать с argparse? Есть ли другие варианты?


person n611x007    schedule 26.11.2013    source источник


Ответы (1)


- consists of 2 or more arguments (eg. --eia key1 1 2 3) (see last point)

Предлагается патч, который позволит использовать nargs как 2 or more по образцу нотации re {n,m}. Но пока я думаю, что nargs='+' - ваш лучший выбор. Важно то, что он захватывает необходимые аргументы. Вы можете проверить наличие «2 или более» после parse_args (это также можно проверить с помощью пользовательского type).

- is optional

Использование флага --eia позаботится об этом.

- edit it can occour multiple times, eg. --eia key1 1,2 --eia key2 2,1 is valid

С флагом --eia это разрешено, но сохраняется только последняя запись. Но action='append' сохранит каждый набор записей в виде списка (или кортежа?); поэтому пространство имен будет иметь args.eia = [['key1','1','2'],['key2',...],...]. Поиграйте с типом действия и убедитесь в этом.

- the type of the first argument may differ from the type of the rest

Проще всего оставить значения в виде строк и выполнить собственное преобразование. Вы можете написать собственный type (или action) для проверки значений. Но код будет похож на тот, который вы использовали после argparse.

- other optional arguments like this can exist

Это будет зависеть от того, как вы напишете добавленный код.

- the example has the delimiter of a , but I'd like to allow delimiting with spaces, because my actual argument values may be strings and I'd like to leave parsing them to the shell (if a string should start with -, quotation marks help: "-asdf")

Основная оболочка, та, которая вызывает ваш скрипт, разбивает командную строку на строки, в основном по пробелам. argparse использует sys.argv, этот список строк. Если этот список не то, что вам нужно, вам придется повозиться с ним, прежде чем передать его argparse.parse_args(argv).

Обычный способ проверить argparse:

parser.parse_args('--eia key1 1,2 --eia key2 2,1'.split())

Повторяет основное разбиение на пробелы, но не имеет дело с кавычками и escape-символами, как это сделала бы оболочка. Есть способ воспроизвести действие оболочки, но мне придется покопаться, чтобы найти его.

person hpaulj    schedule 26.11.2013