带有所需子解析器的Argparse
我正在使用Python 3.4,正在尝试将argparse
与子解析器一起使用,并且我希望具有与Python 2.x中类似的行为,如果我不提供位置参数(指示子解析器/子程序),我会收到一条有用的错误消息.即,使用python2
我会收到以下错误消息:
I'm using Python 3.4, I'm trying to use argparse
with subparsers, and I want to have a similar behavior to the one in Python 2.x where if I don't supply a positional argument (to indicate the subparser/subprogram) I'll get a helpful error message. I.e., with python2
I'll get the following error message:
$ python2 subparser_test.py
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments
我正在按照 https://stackoverflow.com/a/22994500/3061818 中的建议设置required
属性a>,但是这给了我Python 3.4.0的错误:TypeError: sequence item 0: expected str instance, NoneType found
-完全追溯:
I'm setting the required
attribute as suggested in https://stackoverflow.com/a/22994500/3061818, however that gives me an error with Python 3.4.0: TypeError: sequence item 0: expected str instance, NoneType found
- full traceback:
$ 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 :
This is my program subparser_test.py
- adapted from 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)
您需要给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
为了发出此缺少参数"错误消息,代码需要给该参数起一个名字.对于位置参数(如子表达式),该名称(默认情况下)为目标".您链接的SO答案中对此有一个(次要)说明.
In order to issue this 'missing arguments' error message, the code needs to give that argument a name. For a positional argument (like subparses), that name is (by default) the 'dest'. There's a (minor) note about this in the SO answer you linked.
在上一个Python版本中,对argparse
的几个补丁"之一改变了它测试必需"参数的方式.不幸的是,它引入了有关次解析器的错误.此问题需要在下一个版本中解决(如果不早的话).
One of the few 'patches' to argparse
in the last Python release changed how it tests for 'required' arguments. Unfortunately it introduced this bug regarding subparsers. This needs to be fixed in the next release (if not sooner).
如果您希望在Py2中具有这种可选的子解析器行为,则最好的选择似乎是使用
If you want this optional subparsers behavior in Py2, it looks like the best option is to use a two stage parser as described in
如何设置带有python 2.7的Argparse模块的默认子解析器
相关的错误/问题中最近有一些活动
There has been some recent activity in the related bug/issue