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>...