自定义可选参数以包括其自己的位置参数

时间:2019-06-07 21:00:27

标签: python command-line-interface argparse

我希望有一个脚本,该脚本带有命令行参数,包括带有位置参数本身的标志选项。我可能希望命令行输入看起来像

$ ./script.py [-o <file1> <file2> ...] inputfile

argparse documentation官员最类似地谈论

parser.add_argument("-v", "--verbosity", type=int, help="increase output verbosity")
args = parser.parse_args()

用户在-v标志之后输入单个位置子参数(可能是一组选项中的一个)。然后,此位置子参数存储在args.verbosity中。

因此,似乎标志的参数需要包含在同一行add_argument()中。您可以为此子参数的变量声明任何特殊名称(例如args.outputfile1)吗?该标志可以采用多个子参数吗?您可以调整子变量在帮助菜单中的外观吗?默认情况下,它类似于-o OUTPUT, --output OUTPUT Save output data to a file OUTPUT。我们可以更改为读取-o <SomethingElse>吗?

还有更多讨论此方面的文档吗?

2 个答案:

答案 0 :(得分:1)

您建议的界面非常不寻常。人们多次指定相同的选项更为常见,因为tt很难区分./script.py [-o file1 file2 ...]输入文件和./script.py [-o file1] file2 inputfile。那可能还不是问题,但是当您添加选项或禁止使用的参数时,您不寻常的设计将成为问题。

我建议您采用以下解决方法之一:

1。重复选项标志

./script.py -o file1 -o file2 inputfile

2。将您的选项设为布尔标志

更改您的API,以便-o指示除最后一个参数外的所有参数均为输出文件: ./script.py -o output1 output2 ... inputfileislast

答案 1 :(得分:1)

具有如下定义:

parser.add_argument('-o','--output', dest='output_file_name', nargs='+')

您可以使用以下命令行:

$ ./script.py -o file1 file2

并获得等于args.output_file_name的{​​{1}}。 “ +”表示一个或多个参数(记录了其他['file1','file2']值)。

但是

nargs

'an_input_file'转到位置参数的位置很难实现。 '*'是贪婪的,占据一切,为位置保留任何内容。最好定义另一个可选的

$ ./script.py -o file1 file2 an_input_file

如果将'-o'定义为'append'操作,则可以使用:

parser.add_argument('-i','--input')

$ ./script.py -o file1 file2 -i an_input_file

通常,您可以通过使用可选项获得最佳控制。位置表示法是根据位置而不是值进行“解析”的,因此更难以在精美的组合中使用。

使用$ ./script.py -o file1 -o file2 -i an_input_file 参数可以更改metavar的显示。