我的命令行实用程序应该接受彼此连接的多个过滤器(类似于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
,那么使用什么库来处理这样的命令行?
我的问题:
argparse
进行解析?argparse
,那该怎么办?还请注意,将来我可能会决定用Python以外的其他语言(可能是D)重写软件。
答案 0 :(得分:0)
管道应作为程序的单个参数(其中可能有空格,例如使用shell引号)提供。
可以使用+
正则表达式将\s+\+\s+
分成多个过滤器。但是,在拆分引用时+
(\+
)将被忽略。
然后,每个过滤器都作为单独的命令行处理(例如,使用argparse
)。在传递给argparse
之前,应在Whytespace上拆分每个过滤器。
此外,\
引用空格(这样就不会在此空间拆分过滤器)及其本身(\\
)。
请注意,通过调用sh -c 'tr a-z A-Z | tac'
之类的shell管道(此处是sh
程序的单个参数)来提示将管道作为单个参数提供。