我使用以下简单代码来解析一些参数;请注意,其中一个是必需的。不幸的是,当用户在不提供参数的情况下运行脚本时,显示的用法/帮助文本并不表示存在非可选参数,我觉得这非常令人困惑。如何让python指示参数不是可选的?
以下是代码:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
当在不提供所需参数的情况下运行上面的代码时,我得到以下输出:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
答案 0 :(得分:232)
以-
或--
开头的参数通常被视为可选参数。所有其他参数都是位置参数,因此需要设计(如位置函数参数)。可能需要可选参数,但这有点违背他们的设计。由于它们仍然是非位置参数的一部分,因此即使它们是必需的,它们仍将列在令人困惑的标题“可选参数”下。然而,使用部分中缺少的方括号表明它们确实是必需的。
另请参阅documentation:
通常,argparse模块假定像-f和--bar这样的标志表示可选参数,在命令行中总是可以省略。
注意:必填选项通常被视为不良格式,因为用户希望选项是可选的,因此应尽可能避免使用。
话虽如此,帮助中的头文件“位置参数”和“可选参数”由两个参数组生成,其中参数自动分为。现在,您可以“入侵它”并更改可选项的名称,但更优雅的解决方案是为“必需的命名参数”创建另一个组(或者您想要称之为的任何组):
parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('-o', '--output', help='Output file name', default='stdout')
requiredNamed = parser.add_argument_group('required named arguments')
requiredNamed.add_argument('-i', '--input', help='Input file name', required=True)
parser.parse_args(['-h'])
usage: [-h] [-o OUTPUT] -i INPUT
Foo
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output file name
required named arguments:
-i INPUT, --input INPUT
Input file name
答案 1 :(得分:45)
由于我更喜欢在可选之前列出必需的参数,我通过以下方式解决它:
parser = argparse.ArgumentParser()
parser._action_groups.pop()
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
return parser.parse_args()
并输出:
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
--optional_arg OPTIONAL_ARG
我可以在没有“帮助”的情况下生活在可选参数组中。
答案 2 :(得分:27)
建立@Karl Rosaen
parser = argparse.ArgumentParser()
optional = parser._action_groups.pop() # Edited this line
required = parser.add_argument_group('required arguments')
# remove this line: optional = parser...
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
parser._action_groups.append(optional) # added this line
return parser.parse_args()
并输出:
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
-h, --help show this help message and exit
--optional_arg OPTIONAL_ARG
答案 3 :(得分:6)
再过一次,以@RalphyZ为基础
这不会破坏公开的API。
from argparse import ArgumentParser, SUPPRESS
# Disable default help
parser = ArgumentParser(add_help=False)
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')
# Add back help
optional.add_argument(
'-h',
'--help',
action='help',
default=SUPPRESS,
help='show this help message and exit'
)
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
将显示与上面相同的内容,并且应保留在以后的版本中:
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
-h, --help show this help message and exit
--optional_arg OPTIONAL_ARG
答案 4 :(得分:1)
默认情况下,在 parser._action_groups 中有 2 个参数组:位置参数和命名参数(标题为“可选参数”)。 您可以将命名的可选参数添加到现有的“可选参数”组,并将必需的命名参数添加到新的“必需参数”组。之后,您可以重新排列群组:
import argparse
parser = argparse.ArgumentParser(description='Foo')
required = parser.add_argument_group('required arguments')
required.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
groups_order = {
'positional arguments': 0,
'required arguments': 1,
'optional arguments': 2
}
parser._action_groups.sort(key=lambda g: groups_order[g.title])
parser.parse_args(['-h'])
输出:
usage: argparse_argument_groups.py [-h] -i INPUT [-o OUTPUT]
Foo
required arguments:
-i INPUT, --input INPUT
Input file name
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output file name
答案 5 :(得分:0)
您不需要覆盖可选组。
就去做:
parser = argparse.ArgumentParser()
required = parser.add_argument_group('required arguments')
required.add_argument('--required_arg', required=True)
# All arguments set via parser directly will automatically go to the optional group
parser.add_argument('--optional_arg')
parser.print_help()
会打印出来
usage: [-h] --required_arg REQUIRED_ARG [--optional_arg OPTIONAL_ARG]
optional arguments:
-h, --help show this help message and exit
--optional_arg OPTIONAL_ARG
required arguments:
--required_arg REQUIRED_ARG
如果您希望在可选参数之前有必需的参数,您可以执行以下操作:
parser = argparse.ArgumentParser()
optional = parser._action_groups.pop()
required = parser.add_argument_group('required arguments')
parser._action_groups.append(optional)
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
parser.print_help()
将以正确的顺序打印组:
usage: [-h] --required_arg REQUIRED_ARG [--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
-h, --help show this help message and exit
--optional_arg OPTIONAL_ARG