带有 docopt 的两个参数的选项

Tom*_*eus 5 python docopt

我想要一个带有两个参数的选项。即希望能够使用

$ ./foo --path "old" "new"
Run Code Online (Sandbox Code Playgroud)

或者我真正想要的是:

$ ./foo --path "old" "new" --path "old" "new"
Run Code Online (Sandbox Code Playgroud)

但我不知道该怎么办?(事实上​​我担心这可能是不可能的......)


我不想要的,但很接近的

我知道如何有一个重复选项(见下文),但这实际上不是我想要的。

#!/usr/bin/env python3
'''foo

Usage:
  foo [--path ARG]...

Options:
  --path=ARG  Repeating option.
'''

import docopt

args = docopt.docopt(__doc__)

print(args)
Run Code Online (Sandbox Code Playgroud)

可以调用

$ ./foo --path "old" --path "new"
Run Code Online (Sandbox Code Playgroud)

Can*_*ani 3

这可以使用 docopt 轻松存档。

句法:Usage: ./foo [--path <src> <dst>]...

输入:./foo --path src1 dst1 --path src2 dst2

代码:

>>> from docopt import docopt
>>> doc = "Usage: ./foo [--path <src> <dst>]..."
>>> argv = "--path old1 new1 --path old2 new2".split()
>>> args = docopt(doc, argv)
Run Code Online (Sandbox Code Playgroud)

结果:

{
  "--path": 2, 
  "<dst>": [
    "dst1", 
    "dst2"
  ], 
  "<src>": [
    "src1", 
    "src2"
  ]
}
Run Code Online (Sandbox Code Playgroud)

现在用它做一些事情:

>>> if bool(args["--path"]):
>>>     n = 1 if args["--path"] is True else if args["--path"]
>>>     for i in range(0, n)]:
>>>         print("{}, {}".format(args["<old>"][i], args["<new>"][i]))
src1, dst1
src2, dst2
Run Code Online (Sandbox Code Playgroud)

要添加多个位置参数,要求路径选项和参数的顺序正确,并带有括号“ ( ) ”。

Usage: ./foo [(--path <src> <dst>)]... <arg>...
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用带有多个参数的选项,则docopt 不会引发SystemExit用户混淆语法和输入的情况。./foo arg --path src dst您必须自己处理它或在它前面添加另一个(子)命令。

Usage: ./foo [(--path <src> <dst>)]... bar <arg>...
Run Code Online (Sandbox Code Playgroud)