Объединение в командной строке нескольких трансформаций с опциями
Моя утилита командной строки должна принимать несколько фильтров, связанных друг с другом (аналогично конвейеру 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
тогда какую библиотеку использовать для обработки таких командных строк?
Мои вопросы:
- Каковы возможные удобные форматы для таких командных строк?
- Как разобрать это с Python
argparse
? - Если не
argparse
тогда что вместо этого?
Также обратите внимание, что в будущем я могу решить переписать свое программное обеспечение на другом языке (возможно, D), чем Python.
1 ответ
Конвейер должен быть представлен в виде одного аргумента (с возможными пробелами в нем, например, с использованием цитирования оболочки) моей программы.
Трубопровод может быть разделен на несколько фильтров +
с это \s+\+\s+
регулярное выражение. Однако при расщеплении цитируется +
(\+
) должны игнорироваться.
Затем каждый фильтр обрабатывается как отдельная командная строка (например, с использованием argparse
). Прежде чем перейти к argparse
каждый фильтр должен быть разбит на пространство.
Также, \
заключает в кавычки пробелы (чтобы фильтр не разбивался в этом пространстве) и сам (\\
).
Обратите внимание, что предоставление конвейера в качестве единственного аргумента намекается на вызов sh -c 'tr a-z A-Z | tac'
(здесь конвейер является единственным аргументом sh
программа).