【问题标题】:Multiple positional and optional arguments using docopt使用 docopt 的多个位置和可选参数
【发布时间】:2020-04-09 14:35:01
【问题描述】:

我正在尝试使用 docopt 包实现 python3 CLI。我试图让我的程序接受多个位置输入文件,以及可选的输出文件列表。 我的文档字符串的 MWE 是:

__doc__ = """
    Usage:
        test.py [INPUT...] [-o OUTPUT...] [-t TEST]

    Options:
        -o OUTPUT..., --output OUTPUT...  #One output file for each INPUT file [default: DEFAULT]
        -t TEST, --test TEST              #A test option
"""

例如一个程序调用

test.py FILE_A FILE_B -o OUTFILE_A OUTFILE B -t true

应该返回一个字典:

{'--output': ['OUTFILE_A', 'OUTFILE_B'],
 '--test': 'true',
 'INPUT': ['FILE_A', 'FILE_B']}

但由于某种原因,它总是附加到 INPUT 参数中:

{'--output': ['OUTFILE_A'],
 '--test': 'true',
 'INPUT': ['FILE_A', 'FILE_B', 'OUTFILE_B']}

【问题讨论】:

    标签: python command-line-interface docopt


    【解决方案1】:

    不幸的是,Docopt 中的选项只能接受一个参数,因此[-o OUTPUT...] 将不起作用。其余元素将按照您的说明被解释为附加参数。

    解决此问题的一种方法是将省略号移到方括号外:

    Usage:
        test.py [INPUT...] [-o OUTPUT]... [-t TEST]
    

    并像这样使用它:

    test.py FILE_A FILE_B -o OUTFILE_A -o OUTFILE_B
    

    它看起来不太好,但它确实有效。

    【讨论】:

    • 不仅在 Docopt 中,在任何与 POSIX 兼容的命令行程序中,选项后面都应该只有一个参数。更重要的是,选项出现的顺序无关紧要。允许此类事情的程序不兼容 POSIX,并且以非标准方式进行命令行解析。所以问题是 Docopt 是否应该遵循 POSIX 指南。一种可能的解决方法是使用命令(关键字)而不是选项,因为它们的位置很重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多