Python argparse:nargs =’?’

Python argparse: nargs='?' and optional arguments

假设我有一个名为readfile.py的简单程序,它通过使用python的argparse支持命令行参数。

程序从位置参数input指定的文件中读取。如果不指定其他参数,这个程序就不太令人兴奋。它只是从input读取并退出。可选参数--output [OUTPUT_FILE]表示输入文件应写入文件。OUTPUT_FILE也是可选的。如果没有指定,输入应该写入default.out

我的参数分析器设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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不出现在命令行上,我就可以检测到它不存在。

它提供如下使用签名:

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

如果我运行

1
python readfile.py input.in --output somefile.out

1
python readfile.py --output somefile.out input

如果我运行的话,它把output设置为default.out

1
python readfile.py input.in --output

但是如果我跑

1
python readfile.py --output input.in

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

我错过什么了吗?


不,它不会识别这个。在最后一个例子中,您清楚地将input.in传递给--output

我建议您翻转defaultconst参数。您希望默认值为default.out,所以它应该是default='default.out'。然后,可以将const设置为其他值,以便具有空的--output参数。

这样,您就不必添加--output参数,除非您想更改默认值,并且如果您想输出到stdout中,您可以使用空的--output参数。


您可以通过"-"来标记任何选项的结尾。例如:

1
python readfile.py --output -- input

具有预期效果。但是,将参数设置为——需要输出并允许:

1
python readfile.py --output - input

可能更干净。