Python argparse:nargs ='?'和可选参数

时间:2012-12-14 08:40:11

标签: python argparse

假设我有一个名为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

注意我使用default=None,这样如果--ouput没有出现在命令行中,我可以用None来检测它的缺席。

它提供了这样的用法签名:

usage: readfile.py [-h] [--output [OUTPUT_FILE]] input

如果我运行

,它会按预期处理参数
python readfile.py input.in --output somefile.out

python readfile.py --output somefile.out input

如果我运行

,它会将output设置为default.out
python readfile.py input.in --output

但如果我跑

python readfile.py --output input.in

它抱怨争论太少。我认为argparse足够“聪明”来解释这种模式,将input设置为input.in并将output设置为default.out。生成的用法甚至暗示了这一点。

我错过了什么吗?

2 个答案:

答案 0 :(得分:5)

不,它不会认识到这一点。您在最后一个示例中明确地将input.in传递给--output

我建议您翻转defaultconst参数。您希望默认值为default.out,因此它应为default='default.out'。对于具有空const参数的情况,可以将--output设置为其他内容。

这样您就不必添加--output参数,除非您想要更改默认值,如果要输出到{{1,则可以使用空--output参数例如。

答案 1 :(得分:0)

你可以通过" - "标记任何选项的结束。例如:

python readfile.py --output -- input

有预期的效果。但是,将参数设置为--output且允许:

python readfile.py --output - input

可能更干净。