我正在编写一个脚本,用于合并多个输入文件,生成单个输出文件,并且我想使用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
正确处理这样的案例,将最终论点视为位置论点?或者是我接受“解决方法”解决方案的唯一选择,例如将输出文件名也转换为可选参数,例如,like-f --fname_out
或类似。
如果不可能做我想做的事,那么我计划将其作为我的后备解决方案来实施。但是,在我接受一个不优雅的解决方法之前,我很好奇是否真的有可能以argparse
“正确”的方式处理这个问题。