带有所需子解析器的 Argparse
Posted
技术标签:
【中文标题】带有所需子解析器的 Argparse【英文标题】:Argparse with required subparser 【发布时间】:2014-06-14 11:41:28 【问题描述】:我正在使用 Python 3.4,我正在尝试将 argparse
与子解析器一起使用,并且我希望在 Python 2.x 中具有类似的行为,如果我不提供位置参数(到指示子解析器/子程序)我会收到一条有用的错误消息。即,使用python2
我将收到以下错误消息:
$ python2 subparser_test.py
usage: subparser_test.py [-h] foo ...
subparser_test.py: error: too few arguments
我正在按照https://***.com/a/22994500/3061818 中的建议设置required
属性,但这给了我一个Python 3.4.0 错误:TypeError: sequence item 0: expected str instance, NoneType found
- 完整回溯:
$ python3 subparser_test.py
Traceback (most recent call last):
File "subparser_test.py", line 17, in <module>
args = parser.parse_args()
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1717, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1749, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1984, in _parse_known_args
', '.join(required_actions))
TypeError: sequence item 0: expected str instance, NoneType found
这是我的程序subparser_test.py
- 改编自https://docs.python.org/3.2/library/argparse.html#sub-commands:
import argparse
# sub-command functions
def foo(args):
print('"foo()" called')
# create the top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
subparsers.required = True
# create the parser for the "foo" command
parser_foo = subparsers.add_parser('foo')
parser_foo.set_defaults(func=foo)
args = parser.parse_args()
args.func(args)
相关问题:Why does this argparse code behave differently between Python 2 and 3?
【问题讨论】:
【参考方案1】:你需要给subparsers
一个dest
。
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='cmd')
subparsers.required = True
现在:
1909:~/mypy$ argdev/python3 stack23349349.py
usage: stack23349349.py [-h] foo ...
stack23349349.py: error: the following arguments are required: cmd
为了发出此“缺少参数”错误消息,代码需要为该参数命名。对于位置参数(如子解析),该名称(默认情况下)是“dest”。在您链接的 SO 答案中有一个(次要)注释。
在上一个 Python 版本中,argparse
的少数“补丁”之一改变了它测试“必需”参数的方式。不幸的是,它引入了这个关于子解析器的错误。这需要在下一个版本中修复(如果不是更早的话)。
更新
如果您希望在 Py2 中使用这种可选的子解析器行为,看起来最好的选择是使用
中描述的两阶段解析器How to Set a Default Subparser using Argparse Module with Python 2.7
最近有一些相关错误/问题的活动
https://bugs.python.org/issue9253
更新
对此的修复工作正在进行中:https://github.com/python/cpython/pull/3027
【讨论】:
有关 argparse 错误 here 的更多信息。支持该答案似乎有助于提高其在 Python 错误队列中的紧迫性。 Really, I'm not just farming rep for someone! 更新:由于“兼容性”原因,修复已被恢复:bugs.python.org/issue33109 -- 猜这个错误会永远存在 由于 Python 3.7required
可以用作参数:parser.add_subparsers(dest='cmd', required=True)
, docs.python.org
dest 参数不再需要,只需要:p。如,如果你不想给它一个命名的目的地,你可以指定parser.add_subparsers(required=True)
。以上是关于带有所需子解析器的 Argparse的主要内容,如果未能解决你的问题,请参考以下文章
Python argparse 列出已定义解析器的所有可能命令
argparse:声明全局参数后无法获取 subparser_name
在子解析器 args 之后添加*** argparse 参数