【问题标题】:Requiring a command line argument if an optional argument is provided如果提供了可选参数,则需要命令行参数
【发布时间】:2019-02-24 00:30:24
【问题描述】:

我正在尝试编写一个脚本,用户可以在其中从三个不同的选项中进行选择:

python foo.py 
python foo.py -a
python foo.py -b address_arg data_arg

如果用户选择最后一个选项,我需要他们为地址和数据提供两个额外的参数。

我目前正在使用它,因此它需要一个参数,比如这里的地址:

parser.add_argument('-b', '--boo', dest='address', type=str, help="Help message")

如果我运行它会起作用

python foo.py -b 0x00

但我如何要求用户提供数据的第二个参数?

【问题讨论】:

    标签: python command-line-arguments argparse optional-arguments


    【解决方案1】:

    您可以使用nargs=2 设置预期参数的数量。

    https://docs.python.org/3/library/argparse.html#the-add-argument-method

    >>> import argparse
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('-b', '--bar', nargs=2)
    _StoreAction(option_strings=['-b', '--bar'], dest='bar', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=None)
    >>> args = parser.parse_args(['--bar', 'arg1', 'arg2'])
    >>> args.bar
    ['arg1', 'arg2']
    >>> args = parser.parse_args(['--bar', 'arg1'])
    usage: [-h] [-b BAR BAR]
    : error: argument -b/--bar: expected 2 arguments
    

    请注意,此处显示的帮助显示-b BAR BAR,这有点烦人(默认情况下它会重复参数名称)。您可以将metavar 设置为一个元组,以便为​​您需要传递的两个参数显示更好的帮助消息。

    >>> parser.add_argument('-f', '--foo', nargs=2, metavar=('desc1', 'desc2'))
    _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=('desc1', 'desc2'))
    >>> parser.print_help()
    usage: [-h] [-b BAR BAR] [-f desc1 desc2]
    
    optional arguments:
      -h, --help            show this help message and exit
      -b BAR BAR, --bar BAR BAR
      -f desc1 desc2, --foo desc1 desc2
    

    有关更多信息,请参阅此处:https://docs.python.org/3/library/argparse.html#metavar

    【讨论】:

    • 谢谢!如果我需要 arg1 但允许 arg2 是可选的怎么办?
    • @gravytrain 你可以使用nargs='+',如果没有提供至少一个参数,它会出错,它允许你提供多个参数并将它们全部打包到一个列表中。更多信息:docs.python.org/3/library/argparse.html#nargs。您可以使用其他回答者建议的 action 进行进一步自定义,如果您正在执行复杂的命令行解析,我建议您这样做。
    【解决方案2】:

    您在 action 例程中为 -b 强制执行额外参数。

    在那里,您检查您期望的data_arg 的存在和有效性。 仅就存在而言,只需检查参数数量即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 2017-04-04
      • 2012-10-06
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多