在执行命令时,双击是做什么的?

题:

如果一个应用程序在双击后有一个命令时应该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个位置参数testcmdsth

由于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模块呢?

应用程序可以自由地了解如何解释命令行参数。 大多数开发者都遵守一些惯例 – 但有些则不适用。 阅读该命令的文档