猿问

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

我的命令行实用程序应该接受几个相互连接的过滤器(类似于 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那么使用什么库来处理这样的命令行?


我的问题:


这些命令行有哪些可能的用户友好格式?

如何用 Python 解析它argparse?

如果不是argparse,那又是什么?

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


心有法竹
浏览 140回答 1
1回答

弑天下

管道应该作为我的程序的单个参数(其中可能有空格,例如使用 shell 引用)提供。管道可以被+s分割成几个过滤器,也就是正则\s+\+\s+表达式。但是,在拆分引用+( \+) 时应被忽略。然后每个过滤器都作为单独的命令行处理(例如使用argparse)。在传递给argparse每个过滤器之前,应在原因空间上拆分。此外,\引用空格(以便过滤器不会在此空格处拆分)和它本身 ( \\)。请注意,通过调用 shell 管道sh -c 'tr a-z A-Z | tac'(此处管道是sh程序的单个参数)暗示将管道作为单个参数提供。
随时随地看视频慕课网APP

相关分类

Python
我要回答