如何获取argparse来识别跟随可变长度可选参数的位置参数?

时间:2019-11-18 17:54:29

标签: python argparse optional-parameters positional-parameter

我正在编写一个脚本,该脚本将用于合并多个输入文件,生成一个输出文件,并且我想使用argparse构建一个小的命令行界面。对我来说,最自然的方法是有一个可选输入-i,它接受​​一个或多个输入文件名,后跟一个位置参数,代表输出文件名。这是我所想到的示例:

#!/usr/bin/env python3
"""
Script for merging input files
"""
import argparse

script_docstring = 'Read some input files and create a merged output.'
parser = argparse.ArgumentParser(description=script_docstring)
# Optional input file names
parser.add_argument('-i --inputs', nargs='+', type=str, required=True,
                    help='Input file names', dest='inputs')
# Positional output file name
parser.add_argument('fname_out', type=str, help='Output file name')
args = parser.parse_args()

# Display what the user chose at the command line
print(args.inputs)
print(args.fname_out)

当我打印由argparse创建的自动生成的帮助消息时,呼叫签名看起来像我的预期:

> ./mergefiles.py --help
usage: mergefiles.py [-h] -i --inputs INPUTS [INPUTS ...] fname_out

Read some input files and create a merged output.

positional arguments:
  fname_out             Output file name

optional arguments:
  -h, --help            show this help message and exit
  -i --inputs INPUTS [INPUTS ...]
                        Input file names

但是,当我实际尝试运行该脚本时,它给出了一个错误,提示我argparse错误地解析了最终的位置参数,就好像将其包含在可选参数列表中一样:

> ./mergefiles.py -i a.in b.in c.in test.out
usage: mergefiles.py [-h] -i --inputs INPUTS [INPUTS ...] fname_out
mergefiles.py: error: the following arguments are required: fname_out

我的问题:是否甚至有可能让argparse正确处理此类情况,将最终论点视为位置问题?或者,我唯一的选择就是接受“解决方法”解决方案,例如将输出文件名也转换为可选参数,例如-f --fname_out或类似的参数。

如果不可能做我想做的事,那么我计划将其完全实现为我的后备解决方案。但是,在我接受一个优雅的解决方法之前,我很好奇是否实际上有可能让argparse以“正确”的方式进行处理。

1 个答案:

答案 0 :(得分:3)

当使用位置作为最后一个参数时,必须使用-分隔参数:

python3 args.py -i infile1 infile2 -- outfile
['infile1', 'infile2']
outfile

我希望这对您有帮助