Python 带有docopt的两个参数的选项

Python 带有docopt的两个参数的选项,python,docopt,Python,Docopt,我想要一个接受两个参数的选项。即希望能够使用 $ ./foo --path "old" "new" 或者我真正想要的是: $ ./foo --path "old" "new" --path "old" "new" 但我不知道怎么做?(事实上,我担心这可能不可能…) 我不想要的,但哪一个很接近 我知道如何有一个重复选项(见下文),但这并不是我想要的 #!/usr/bin/env python3 '''foo Usage: foo [--path ARG]... Options:

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

$ ./foo --path "old" "new"
或者我真正想要的是:

$ ./foo --path "old" "new" --path "old" "new"
但我不知道怎么做?(事实上,我担心这可能不可能…)


我不想要的,但哪一个很接近 我知道如何有一个重复选项(见下文),但这并不是我想要的

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

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

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

import docopt

args = docopt.docopt(__doc__)

print(args)
可以打电话

$ ./foo --path "old" --path "new"

使用docopt无法实现这一点

该项目的业主提出以下理由:

因为在像
prog--foo-bar-baz-qux
这样的调用中,人们无法判断它的意思是
prog--foo=bar-baz-qux
还是
prog--foo=bar,baz-qux

我认为这很合理

我建议改为使用两个选项,可能是
--从
--到
,或者
--旧路径
--新路径

或者,您可以使用,并设置选项(例如,
nargs=2
)。

您可以使用click lib


这可以通过docopt轻松存档

语法:
用法:./foo[--path]…

输入:
/foo——路径src1 dst1——路径src2 dst2

代码:


谢谢我知道argparse解决方案,但为了简单起见,我切换到了docopt。我想在我的实际问题中,我也可以要求用户指定
--path=“/old/path;/new/path”
,并有一个
--sep
选项。感谢您的点击建议。但是,您的解决方案似乎对我不起作用:
/foo--path test测试用法:示例[OPTIONS]错误:获取了意外的额外参数(test)
@TomdeGeus/foo-m test1-m test2。不过它不是很健壮。。。从某种意义上说,它可以在没有任何警告的情况下与位置参数混合在一起。我遇到的唯一问题是,如果您混合输入并在选项之间使用位置参数,docopt不会引发
SystemExit
,但您可以检查已解析的选项的语法是否正确,然后自己引发它。您可以指定位置参数的问题吗?在本例中,当我输入
/foo--path a b c
时,我认为应该引发一个错误(当然我可以手动执行此操作,但问题仍然不大)。但是使用
用法:./foo[--path]变得更加麻烦。在这个特殊的例子中,`./foo--path a b c`不能被解析,我认为应该是这样的?如果您想添加这样的位置参数,您应该要求
--path
与parens“()”的顺序正确。我已经更新了我的问题。我刚才提到的缺少
SystemExit
的问题就是这种情况。这是一个错误的用法,因为选项应该位于位置参数前面。使用(sub)命令可以避免这种情况。
@click.command()
@click.option('--path', '-m', multiple=True)
def run(path):
    print('\n'.join(path))
>>> from docopt import docopt
>>> doc = "Usage: ./foo [--path <src> <dst>]..."
>>> argv = "--path old1 new1 --path old2 new2".split()
>>> args = docopt(doc, argv)
{
  "--path": 2, 
  "<dst>": [
    "dst1", 
    "dst2"
  ], 
  "<src>": [
    "src1", 
    "src2"
  ]
}
>>> 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
Usage: ./foo [(--path <src> <dst>)]... <arg>...
Usage: ./foo [(--path <src> <dst>)]... bar <arg>...