假设我有一个简单的程序readfile.py,通过使用Python来支持命令行参数argparse.
程序从位置参数指定的文件中读取input.没有指定其他参数,这个程序不是很令人兴奋.它只是读取input和退出.可选参数--output [OUTPUT_FILE]表示应将输入文件写入文件.OUTPUT_FILE也是可选的.如果未指定,则应写入输入default.out.
我设置了我的参数解析器,如下所示:
parser = argparse.ArgumentParser(description='Read from a file')
parser.add_argument(
'input',
help='file to read from')
parser.add_argument(
'--output',
nargs='?',
const='default.out',
default=None,
help="""write file to %(metavar)s. If %(metavar)s isn't
specified, write file to %(const)s.""",
metavar='OUTPUT_FILE')
args = parser.parse_args()
return args.file, args.output_file
Run Code Online (Sandbox Code Playgroud)
注意我使用default=None如果--ouput没有出现在命令行上,我可以用None检测它的缺席.
这给出了这样的用法签名:
usage: readfile.py [-h] [--output [OUTPUT_FILE]] input
Run Code Online (Sandbox Code Playgroud)
如果我运行,它会按预期处理参数
python readfile.py input.in --output somefile.out
Run Code Online (Sandbox Code Playgroud)
要么
python readfile.py --output somefile.out input
Run Code Online (Sandbox Code Playgroud)
它集output来default.out,如果我跑
python readfile.py input.in --output
Run Code Online (Sandbox Code Playgroud)
但如果我跑
python readfile.py --output input.in
Run Code Online (Sandbox Code Playgroud)
它抱怨论点太少了.我想argparse是"聪明",足以解释这种模式,设置input到input.in和output到default.out.生成的用法甚至暗示了这一点.
我错过了什么吗?
不,它不会认识到这一点.你是最后一个例子清楚地传递input.in到--output.
我建议你翻转default和const参数.您希望默认值为default.out,因此它应该是default='default.out'.const然后可以为具有空--output参数的情况设置其他内容.
这样您就不必添加--output参数,除非您想要更改默认值,并且--output如果要输出到stdout例如,则可以使用空参数.