【问题标题】:Docopt accepts multi args in middle?Docopt 在中间接受多参数?
【发布时间】:2022-02-07 16:23:09
【问题描述】:

我希望我的脚本像“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'}

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

【问题讨论】:

  • argparse ... 或 optparse ... 或手动执行 ...
  • 我不清楚问题是什么。您正在寻找一种方法吗?你试过但失败了? argparse 没有产生你想要的结果?
  • @JoranBeasley 给我们看一些东西,听起来很简单。意识到,处理具有预期多重性的参数后跟其他参数并不是一件容易的事。

标签: python docopt


【解决方案1】:

目前不支持

你不是唯一一个梦想这种功能的人,请参阅 docopt issue #190 Repeating positional arguments followed by a single positional argument

重复参数后跟选项的歧义

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

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

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

带有值的重复选项

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

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

将重复的参数放在最后一个

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

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

结论

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

【讨论】:

    【解决方案2】:

    多年后,我遇到了类似的需求并审查了这个问题,我发现接受的回复所提到的问题仍然悬而未决。

    但是,我发现现在有一个替代库 docpie,它实现了为 cli 解析 docstring 的相同原理,但支持 cp 语法。由于它与 docopt 极其相似(以及随后的相对兼容性),这里有一个explicit list of differences

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2018-06-14
      • 2020-02-17
      • 2010-12-27
      • 2016-04-04
      相关资源
      最近更新 更多