如果提供了可选参数,则需要命令行参数

3

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

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

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

6
你可以使用 nargs=2 来设置期望的参数数量。 https://docs.python.org/zh-cn/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
@gravytrain 你可以使用 nargs='+',如果至少没有提供一个参数,则会出现错误,并且它允许您提供多个参数并将它们全部打包到列表中。更多信息请参见:https://docs.python.org/3/library/argparse.html#nargs。如果您正在进行复杂的命令行解析,我建议您使用其他回答者建议的 action 进行进一步的自定义。 - alkasm

0

你需要在action例程中强制使用-b的额外参数。

在那里,你需要检查你期望的data_arg的存在和有效性。 仅对于存在性,简单地检查参数数量即可完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接