我正在尝试编写一个函数,您可以通过argparse解析可变数量的参数--我知道我可以通过nargs=“+”
实现这一点。遗憾的是,argparse help的工作方式(以及人们通常在CLI中编写参数的方式)将位置参数放在最后。这导致我的位置参数作为可选参数的一部分被捕获。
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("positional", help="my positional arg", type=int)
parser.add_argument("-o", "--optional", help="my optional arg", nargs='+', type=float)
args = parser.parse_args()
print args.positional, args.optional
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] positional
test.py: error: too few arguments
要获得对参数的正确解析,我必须运行./test.py 100-o 0.21 0.11 0.33 0.13
那么我该如何:
>
使argparse重新格式化用法输出,以减少误导,甚至更好:
对此有一个bug报告:http://bugs.python.org/issue9338
argparse nargs=“?”、“*”或“+”的选项后不能跟位置词
一个简单的(用户)修复方法是使用--
将后置词与选项词分开:
./test.py -o 0.21 0.11 0.33 0.13 -- 100
我写了一个补丁,保留了一些参数供定位器使用。但这不是一个微不足道的问题。
至于更改使用行--最简单的就是自己写,例如:
usage: test.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -- positional
我不建议在用法格式化程序中添加逻辑来进行这种更改。我想这会变得太复杂了。
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -p POSITIONAL
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] [-p POS_WITH_DEFAULT]
在此方法中,actions
是参数的列表,按定义它们的顺序排列。默认的行为是将'optionals'和'positionals'拆分,并以positionals在末尾重新组合列表。还有一些额外的代码可以处理需要换行的长行。通常情况下,它将位置放在单独的一行上。我忽略了这一点。
class Formatter(argparse.HelpFormatter):
# use defined argument order to display usage
def _format_usage(self, usage, actions, groups, prefix):
if prefix is None:
prefix = 'usage: '
# if usage is specified, use that
if usage is not None:
usage = usage % dict(prog=self._prog)
# if no optionals or positionals are available, usage is just prog
elif usage is None and not actions:
usage = '%(prog)s' % dict(prog=self._prog)
elif usage is None:
prog = '%(prog)s' % dict(prog=self._prog)
# build full usage string
action_usage = self._format_actions_usage(actions, groups) # NEW
usage = ' '.join([s for s in [prog, action_usage] if s])
# omit the long line wrapping code
# prefix with 'usage:'
return '%s%s\n\n' % (prefix, usage)
parser = argparse.ArgumentParser(formatter_class=Formatter)
这会产生一个用法行,如:
usage: stack26985650.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]
问题内容: 我正在尝试编写一个函数wo,您可以通过argparse解析可变数量的参数- 我知道我可以通过做到这一点。可悲的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)使位置参数处于最后位置。这导致我的位置参数被视为可选参数的一部分。 运行它,如下面的用法说明所示: 但是如果我跑步给我 为了获得正确的参数解析,我必须运行 那么我该如何: 使argparse重新格式化用法
问题内容: 我有一个脚本,打算像这样使用: 是一个位置参数,其定义如下: 我希望它是可选的:未指定时,它应该只是。 不幸的是,当我不指定参数时,我得到了。 问题答案: 使用(或如果您需要多个目录) 扩展示例:
问题内容: 试图解析可选的位置参数时,我遇到了以下问题: 例: 输出: 为什么不接受第三个程序调用?这是argparse的限制吗? 问题答案: 这是argparse的局限性,但在3.7中已部分取消。 Unix工具通常不声称支持选项和参数的混合,即使它们经常支持。问题在于将其与子命令等其他功能结合使用会导致歧义。因此,通常,支持所有这些功能的库都会在问题上出现问题,并且不允许混用。或者,他们做一些骇
问题内容: 我有一个小问题。我有一个选择是情节的。我希望能够传递类似的数字。但是,这不起作用-解释这是一个位置参数。如果我这样做了,请执行以下操作:将其读取为负数。是否可以阅读? 下面的代码,和我将如何运行它的一个示例是: 如果我执行以下操作,则可以: 编码: 尽管我可以使它以这种方式工作,但我确实更希望能够使用科学计数法。谁有想法? 干杯 问题答案: 正如评论所指出的那样,问题在于前缀被解析为选
我有一些代码现在看起来有点像这样: 如您所见,我目前正在将对的调用包装在语句中,因为该函数可能会失败(它依赖于外部web服务调用)。 我的问题是:语句应该是a)在问题函数之外(就像我现在看到的那样)还是b)在问题函数内部? 谢谢。
问题内容: Python2.7 argparse仅在互斥组中接受可选参数(前缀): $ mydaemon -h 有没有一种方法可以使argparse参数的行为类似于传统的unix守护程序控件: 问题答案: 对于其中的所有功能和选项,我认为您永远不会获得看起来像您想要的“罐头”用法字符串。 也就是说,自您的原始帖子起,您是否查看过子解析器? 这是一个准系统的实现: 使用选项运行此命令将产生: 这种方