Python 如何让argparse识别跟随可变长度可选参数的位置参数?

Python 如何让argparse识别跟随可变长度可选参数的位置参数?,python,argparse,optional-parameters,positional-parameter,Python,Argparse,Optional Parameters,Positional Parameter,我正在编写一个脚本,该脚本将用于合并多个输入文件,生成一个输出文件,并且我希望使用创建一个小型命令行界面。对我来说,最自然的方法是使用一个可选输入,-i,它接受一个或多个输入文件名,后跟一个位置参数,表示输出文件名。下面是我想到的一个例子: #/usr/bin/env蟒蛇3 """ 用于合并输入文件的脚本 """ 导入argparse script_docstring='读取一些输入文件并创建合并输出。' parser=argparse.ArgumentParser(description=sc

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

#/usr/bin/env蟒蛇3
"""
用于合并输入文件的脚本
"""
导入argparse
script_docstring='读取一些输入文件并创建合并输出。'
parser=argparse.ArgumentParser(description=script\u docstring)
#可选输入文件名
add_参数('-i--inputs',nargs='+',type=str,required=True,
help='Input file name',dest='inputs')
#位置输出文件名
parser.add_参数('fname_out',type=str,help='Output file name')
args=parser.parse_args()
#显示用户在命令行中选择的内容
打印(参数输入)
打印(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
以“正确”的方式来处理这个问题。

当使用位置作为最后一个必须使用的参数时——将参数分开:

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

我希望这有帮助

不,你不能欺骗
argparse
来处理这个问题。由于
+
输入将获取所有剩余的字符串,而
fname\u输出将不保留任何字符串。理想情况下,它应该进行某种“前瞻”,并为位置代码保留一个,但当前代码没有这样做。首先放置位置字符串应该会起作用:“test.out-iabc”是的,某种类型的前瞻功能(我想这类似于某些应用程序中存在的功能)是我所想到的。谢谢你确认它没有实现,因此没有触发它的秘密技术。谢谢——这确实像宣传的那样有效,而用于分隔参数(“--”)的双破折号输入技术是我不知道的,所以是的,它很有帮助。不过,我也会将此解决方案归类为一种变通方法,只是另一种类型。@stachyra:双破折号
--
不是变通方法,它是一种功能:-)
man bash
说它表示选项的结束,之后只允许位置参数。见例。