在命令行中链接多个带有选项的转换

时间:2018-12-08 20:10:19

标签: python command-line argparse

我的命令行实用程序应该接受彼此连接的多个过滤器(类似于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

在这里,我尝试链接四个过滤器子命令:scriptchaintranformationtranformation。但是Python argparse(貌似)不支持在一个命令行中包含多个子命令。

如果不是argparse,那么使用什么库来处理这样的命令行?

我的问题:

  1. 此类命令行可能有哪些用户友好格式?
  2. 如何使用Python argparse进行解析?
  3. 如果不是argparse,那该怎么办?

还请注意,将来我可能会决定用Python以外的其他语言(可能是D)重写软件。

1 个答案:

答案 0 :(得分:0)

管道应作为程序的单个参数(其中可能有空格,例如使用shell引号)提供。

可以使用+正则表达式将\s+\+\s+分成多个过滤器。但是,在拆分引用时+\+)将被忽略。

然后,每个过滤器都作为单独的命令行处理(例如,使用argparse)。在传递给argparse之前,应在Whytespace上拆分每个过滤器。

此外,\引用空格(这样就不会在此空间拆分过滤器)及其本身(\\)。

请注意,通过调用sh -c 'tr a-z A-Z | tac'之类的shell管道(此处是sh程序的单个参数)来提示将管道作为单个参数提供。