3

我希望我的脚本像“cp”命令一样接受命令行参数:

'''
Usage:
cp.py <source>... <directory>
cp.py -t <directory> <source>...
cp.py -s <source>... -t <directory>
'''

那些命令行

$ python cp.py src/path/1 src/path/2 target/path
$ python cp.py -t target/path src/path/1 src/path/2
$ python cp.py -s src/path/1 src/path/2 -t target/path

将得到相同的结果:

{'<source>':['src/path/1', 'src/path/2'],'<directory>': 'target/path'}

非常感谢。对不起我的英语:)

4

2 回答 2

2

目前不支持

你不是唯一一个梦想这种功能的人,请参阅 docopt issue #190重复位置参数,后跟单个位置参数

重复参数的歧义,后跟一个选项

重复位置参数后面的选项使解析模棱两可。想象一个文件,与命令选项具有相同的名称 - 您将如何指定它以及您期望的结果是什么?

建议的替代方案(更改命令行设计)

我会假设,您更喜欢将目标目录放在最后,以使用户直观。

带有值的重复选项

Usage:
    cp.py  (-s <source>)... -t <directory>

这允许一个目标目录和多个源。

将重复的参数作为最后一个

Usage:
    cp.py <directory> <source>...

这打破了目标作为最后一个的偏好,但很容易。

结论

  • Current 目前docopt不支持该样式,cp正在使用。一个原因是这并不容易,另一个原因cp是有时过于复杂甚至模棱两可。
  • 使用重复的参数后跟选项总是很棘手,尽量避免这种情况。
  • 选项是可选的,因此使用必需的选项与易于使用命令行程序的规则相矛盾。
  • 目前,我的偏好是使用目标参数作为第一个位置参数,然后是重复的源位置参数。
  • docopt如果允许多个位置参数后跟一组固定的位置参数,那就太好了,但目前尚未实现。
于 2014-06-27T20:09:21.660 回答
0

多年后达到类似的需求并回顾了这个问题,我看到接受的回复所提到的问题仍然存在。

但是,我发现现在有一个替代库docpie ,它实现了为 cli 解析文档字符串的相同原理,但支持cp语法。由于它与 docopt 的极端相似性(以及随后的相对兼容性),这里有一个明确的差异列表

于 2022-02-07T08:23:09.263 回答