我在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遇到同样的问题,第一个问题会持续消耗参数直到结束。如果我做了一个位置和一个可选,那么误导性的使用信息仍然是一个问题。
答案 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
选项转换为纯可选位置参数列表。然后,无论是在帮助消息中还是在实际使用中,都不会混淆哪些参数是文件列表的一部分。