更改argparse用法消息参数顺序

时间:2015-05-13 20:26:10

标签: python python-3.x command-line-arguments argparse

我在python3中使用argparse。在我的脚本中,我有一些subparsers,一个位置参数和一些可选参数。我有一个可选参数来传递任意数量的文件路径,它使用nargs='*'。我的脚本的用法消息显示如下:

usage: myprog.py subparser1 [-h] [--dir DIR] 
                            [--files [FILES [FILES ...]]]
                            positional_arg

但是如果您实际将positional_arg放在此用法消息建议的--files标志之后,我认为解析器最终会将其作为文件路径使用(因为nargs='*' }),然后抛出一个错误,因为它没有找到所需的positional_arg

我认为打印使用信息的方式具有误导性。由于我有多个subparser,我想找到一种方法来更改所有使用消息(不使用usage=参数手动输入所有消息)只是为了首先显示位置参数,希望能够清除混乱

所以我的主要问题是如何在argparse消息的使用部分中更改参数的排序方式?

编辑以解决一个对我不起作用的可能解决方案。

我不想将--files标志添加为nargs='*'的位置参数。首先,因为它现在显示在"位置参数"帮助消息的一部分而不是"可选参数"包含其余可选参数的部分,因此它看起来像是必需的,即使你可以传递0个参数。

其次,因为如果我想要另一个标志除--files之外还有任意数量的参数(例如--folders),并且如果我将它们作为位置参数,我就是#39 ; d遇到同样的问题,第一个问题会持续消耗参数直到结束。如果我做了一个位置和一个可选,那么误导性的使用信息仍然是一个问题。

2 个答案:

答案 0 :(得分:1)

这里有几个问题 - 如何解析参数,以及如何格式化使用。

一些快速修复:

使用--标记选项列表的结尾和位置的开头。

另一种可能性是将positional变为optional。也就是说,给它一个简单的标志,如果需要,还可以required参数。然后它可以放在subparser的输入中的任何位置。

https://stackoverflow.com/a/26986546/901925解决了* * optional之后的位置问题。它提出了相同的快速建议。它还显示了如何将帮助格式化程序更改为不将位置移动到使用结束。但它并没有解决多线使用案例。

在最近的SO问题中也讨论了使用顺序, https://stackoverflow.com/a/29619171/901925

如果您不喜欢默认参数分组(位置和选项),则可以使用具有不同标题和说明的argument_groups。像“'?'和' *','必需'参数,名称如' optionals'和'定位'可能会令人困惑。我试图使用标记为'对于' optionals',希望它不那么令人困惑。

答案 1 :(得分:0)

因为argparse没有对命令行中使用选项的位置施加任何限制,所以对于选项采用任意数量的参数没有任何意义。另一方面,位置参数 do 具有强制执行的顺序。我做了类似

的事情
add_argument("positional_arg")
add_argument("files", nargs='*', help="Optional, one or more files")

相反,将--files选项转换为纯可选位置参数列表。然后,无论是在帮助消息中还是在实际使用中,都不会混淆哪些参数是文件列表的一部分。