题:
如果一个应用程序在双击后有一个命令时应该parsing命令行? (不重复这个和这个 )
我知道什么会正常地加倍冲刺:
A – 表示选项结束并禁用进一步的选项处理。 – 之后的任何参数都被视为文件名和参数。 一个论点 – 相当于 –
因此,它将以下内容设置为参数,例如: myapp -f <args> ...
然后$ myapp -f -- -a -b
将-a
和-b
作为-f
参数,而不是标志
但是当一个应用程序需要时会发生什么:
myapp cmd <arg> -f <args>...
而命令行是$ myapp -f -- test cmd sth
应该parsing为:
myapp
收到一个带有参数test
cmd
和-f
标志 myapp
收到一个cmd
命令,接着是某个带参数test
的-f
我正在为python写一个命令行parsing器,所以我需要知道它应该如何performance。
多谢 :)
你写了
$ 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
; 第一个是在p
定义的store_true
选项,第二个是在p1
定义的选项。 你的命令行
myapp -f -- test cmd sth
如果-f
期望参数,则会产生一个错误。 如果-f
不是,那么myapp
只需要一个选项-f
和3个位置参数test
, cmd
和sth
。
由于myapp -f -- test cmd sth
没有其他参数以连字符开始,因此该命令与myapp -f test cmd sth
之间没有语义上的区别 。 所以无论这个命令如何,先前的一个也是如此。
一个论点
-
相当于--
。
你是从一些权威的引用引用这个,还是你自己的解释? 因为许多程序将单个对象视为标准输入/输出的特殊文件名称。 所以,例如在
$ diff - somefile
-
意味着“从标准输入读取第一个文件”,而
$ diff -- -o somefile
意思是“从笨笨的文件-o
读取第一个文件”。 如果我们想比较从标准输入读取的文件和-o
,那么命令就是
$ diff - -- -o
相当于
$ diff -- - -o
但只有当你不适用你引用的规则。
但是当一个应用程序需要时会发生什么:
myapp cmd <arg> -f <args>...
首先我会认为这是一个有问题的设计,因为通常情况下,选择应该在位置论证之前进行。 虽然如果这是明确的,它们可能是混合的,在这里它似乎不是。
你的例子的其余部分对我来说并不完全清楚(你是否可能忘记在你的例子中列出cmd
?),但似乎问题的根源在于接受多于一个可变长度的参数列表。 在这里,它们是否直接参与选项或主程序并不重要。 接受这些选项的程序通常必须引入自己的语法来消除命令行的歧义。 例如, find
程序的-exec
选项用a结束它的参数列表;
。 另一个窍门是要求用户将参数作为一个标记传递,并用特殊字符分隔它们。 例如, mount
程序的-o
选项接受一个以逗号分隔的传递给程序的参数列表作为一个标记。
我正在为python写一个命令行解析器,所以我需要知道它应该如何表现。
可以肯定的是:你是否从标准库中发现了argparse
模块呢?
应用程序可以自由地了解如何解释命令行参数。 大多数开发者都遵守一些惯例 – 但有些则不适用。 阅读该命令的文档