需要nargs='+'
或nargs=<integer>
的位置参数,这意味着如果参数未指定至少一次,则argparse
会出错。但是,如果用户使用-h|--help
选项调用程序,则无论是否指定了位置参数,都不会给出错误。
如何实现-h
之类的自定义选项,不需要设置位置参数,同时仍需要所有其他选项的位置参数?
例如,如果我们说我的程序有以下(或类似)用法文本:
usage: PROG [-h] [-o] [-u] positional
如何实现以下行为:
PROG
且没有定位是错误PROG
调用-u
并且没有定位是错误PROG
PROG
或-h
调用-o
这符合除最后一项之外的所有要求,即-o
仍然需要指定位置参数。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional', nargs=1)
parser.add_argument('-o', action='store_true')
parser.add_argument('-u', action='store_true')
args = parser.parse_args()
print(args)
argparse
是否有内置方式表示positional
不需要 iff -o
,或者必须手动执行此行为?
答案 0 :(得分:0)
为位置参数设置nargs='?'
或nargs='*'
(即使其成为可选项),然后在args = parser.parse_args()
之后立即添加以下行:
if not args.o and args.positional is None:
parser.error("the following arguments are required: positional")
或添加这些行,由this answer提供:
if len(sys.argv) == 1:
# display help message when no args are passed.
parser.print_help()
sys.exit(1)
如果未指定选项或位置参数,则只会打印帮助消息。此行为与许多命令行程序一致,例如git
。
当然,使positional
可选会影响使用消息:
usage: PROG [-h] [-o] [-u] [positional]
如果你真的不希望这种情况发生,你可以覆盖这样的使用方法:
parser = argparse.ArgumentParser(usage="%(prog)s [-h] [-o] [-u] positional")