Объединение в командной строке нескольких трансформаций с опциями - PullRequest
0 голосов
/ 08 декабря 2018

Моя утилита командной строки должна принимать несколько фильтров, связанных друг с другом (аналогично конвейеру 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.Но Python argparse (похоже) не поддерживает наличие нескольких подкоманд в одной командной строке.

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

Myвопросы:

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

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

1 Ответ

0 голосов
/ 12 декабря 2018

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

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

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

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

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

...