Объединение в командной строке нескольких трансформаций с опциями

Моя утилита командной строки должна принимать несколько фильтров, связанных друг с другом (аналогично конвейеру Unix).

Каждый фильтр имеет несколько параметров. Например chain В настоящее время фильтр имеет следующие параметры:

  -t NAMESPACE, --target NAMESPACE
                        target namespace(s)
  -s {precedence,doc}, --next-script {precedence,doc}
                        "next script" algorithm ("precedence" is not
                        supported)
  -n {ignore,remove,error}, --not-in-target {ignore,remove,error}
                        what if a result is not in target NS
  -u URL, --universal-precedence URL
                        universal precedence
  -W {inverseofsum,sumofinverses}, --weight-formula {inverseofsum,sumofinverses}
                        formula for weighting scripts

Как представить в аргументах команды рабочий процесс фильтров?

Первая мысль - использовать массив JSON. Но JSON не совсем хороший формат для командной строки.

Следующая мысль - разделить фильтры с помощью какого-либо разделителя. Может быть -- или же --separator или как это. Но -- уже используется для отделения параметров командной строки от других аргументов командной строки, и --separator выглядит не очень хорошо.

Еще одна проблема в том, что пока я использую Python 3 argparseэтот пакет, кажется, не подходит для нескольких подкоманд, связанных в одну командную строку, например:

boiler script filter1 --separator \
  chain -t http://www.w3.org/1999/xhtml -n error --separator \
  transformation filter2 --arg x=y --separator \
  transformation filter3

Здесь я пытаюсь объединить четыре подкоманды фильтра: script, chain, tranformation, tranformation, Но питон argparse (похоже) не поддерживает наличие нескольких подкоманд в одной командной строке.

Так что если нет argparse тогда какую библиотеку использовать для обработки таких командных строк?

Мои вопросы:

  1. Каковы возможные удобные форматы для таких командных строк?
  2. Как разобрать это с Python argparse?
  3. Если не argparseтогда что вместо этого?

Также обратите внимание, что в будущем я могу решить переписать свое программное обеспечение на другом языке (возможно, D), чем Python.

1 ответ

Решение

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

Трубопровод может быть разделен на несколько фильтров +с это \s+\+\s+ регулярное выражение. Однако при расщеплении цитируется + (\+) должны игнорироваться.

Затем каждый фильтр обрабатывается как отдельная командная строка (например, с использованием argparse). Прежде чем перейти к argparse каждый фильтр должен быть разбит на пространство.

Также, \ заключает в кавычки пробелы (чтобы фильтр не разбивался в этом пространстве) и сам (\\).

Обратите внимание, что предоставление конвейера в качестве единственного аргумента намекается на вызов sh -c 'tr a-z A-Z | tac' (здесь конвейер является единственным аргументом sh программа).

Другие вопросы по тегам