问题:
在双击之后有一个命令时应用程序应如何解析命令行? (不重复this和this)
我知道双击通常会做什么:
A - 表示选项结束并禁用其他选项 处理。 - 之后的任何论据都被视为文件 - 名称和参数。 - 的参数等同于 -
因此它将以下内容设置为参数,例如:
myapp -f <args> ...
然后$ myapp -f -- -a -b
会将-a
和-b
视为-f
的参数,而不是标志
但是当应用需要时会发生什么:
myapp cmd <arg> -f <args>...
命令行是$ myapp -f -- test cmd sth
,它应解析为:
myapp
收到-f
标记,其中包含参数test
,cmd
和sth
myapp
收到cmd
命令后跟sth
,-f
参数test
我正在为python编写命令行解析器,所以我需要知道它应该如何表现。
很多:)
答案 0 :(得分:3)
你写了
$ myapp -f -- -a -b
会将-a和-b视为-f的参数,而不是Flags
不完全。双击法为-a
提供-b
和myapp
个参数。如果-f
期望参数,则使用双破折号会引发错误,因为没有给出这样的参数。
如果您的解析器定义了一个子解析器,那么它之前的任何选项都被假定为主解析器定义的选项,子命令后面的任何选项都是子解析器的一部分。例如,使用
p = ArgumentParser()
p.add_argument("-v", action='store_true')
sp = p.add_subparsers()
p1 = sp.add_parser('cmd')
p1.add_argument('-v')
命令行myapp -v cmd -v test
会以不同方式处理这两个-v
;第一个是store_true
上定义的p
选项,第二个是p1
上定义的选项。你的命令行
myapp -f -- test cmd sth
如果-f
需要参数,会产生错误。如果-f
没有,则myapp
只有一个选项-f
和3个位置参数test
,cmd
和sth
。
答案 1 :(得分:1)
由于myapp -f -- test cmd sth
中没有其他参数以连字符开头,因此该命令与myapp -f test cmd sth
之间没有语义差异。所以无论那个命令做什么,前一个命令都可以。
答案 2 :(得分:1)
-
的参数等同于--
。
您是从某些权威参考中引用此信息还是您自己的解释?因为许多程序将单个-
视为标准输入/输出的特殊文件名。所以,例如在
$ diff - somefile
-
表示“从标准输入读取第一个文件”,而
$ diff -- -o somefile
表示“从笨拙命名的文件-o
中读取第一个文件”。如果我们想要将标准输入读取的文件与-o
进行比较,则命令为
$ diff - -- -o
相当于
$ diff -- - -o
但仅限于您未应用您引用的规则。
但是当应用需要时会发生什么:
myapp cmd <arg> -f <args>...
我认为首先是一个有问题的设计,因为通常情况下,选项应该在位置参数之前进行。虽然它们可能是混合的,如果这是明确的,这在这里似乎不是。
您的示例的其余部分对我来说并不完全清楚(您是否忘记在示例中列出cmd
?)但似乎问题的来源是接受多个可变长度的参数列表。在这里,它们是直接参数还是主程序并不重要。接受此类选项的程序通常必须引入自己的语法来消除命令行的歧义。例如,-exec
程序的find
选项使用;
终止其参数列表。另一个技巧是要求用户将参数作为一个标记传递,并用特殊字符分隔它们。例如,-o
程序的mount
选项接受以逗号分隔的参数列表作为一个标记传递给程序。
我正在为python编写命令行解析器,所以我需要知道它应该如何表现。
只是为了确定:您是否从标准库中发现了argparse
模块?
答案 3 :(得分:0)
应用程序可以随意解释如何解释命令行参数。大多数开发人员都遵守一些惯例 - 但有些则没有。阅读命令的文档