Python 带有所需子parser的Argparse

Python 带有所需子parser的Argparse,python,python-3.x,python-2.7,argparse,Python,Python 3.x,Python 2.7,Argparse,我使用的是Python3.4,我尝试对子parser使用argparse,我希望有一个类似于Python2.x中的行为,如果我不提供位置参数(指示子parser/子程序),我将得到一条有用的错误消息。例如,使用python2我将得到以下错误消息: $ python2 subparser_test.py usage: subparser_test.py [-h] {foo} ... subparser_test.py: error: too few arguments 我正在按照中的建议

我使用的是Python3.4,我尝试对子parser使用
argparse
,我希望有一个类似于Python2.x中的行为,如果我不提供位置参数(指示子parser/子程序),我将得到一条有用的错误消息。例如,使用
python2
我将得到以下错误消息:

$ python2 subparser_test.py    
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments
我正在按照中的建议设置
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

相关问题:

您需要给
子parser
a
dest

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='cmd')
subparsers.required = True
现在:

为了发出此“缺少参数”错误消息,代码需要为该参数指定一个名称。对于位置参数(如子面板),该名称(默认情况下)为“dest”。在您链接的SO答案中有一个(次要)注释

在上一个Python版本中,
argparse
的少数几个“补丁”之一改变了它测试“必需”参数的方式。不幸的是,它引入了这个关于子parser的bug。这需要在下一个版本中修复(如果不是更早的话)

更新 如果您想在Py2中使用此可选的子解析器行为,那么最好的选择似乎是使用两阶段解析器,如中所述

在相关的错误/问题中最近有一些活动

更新
正在对此进行修复:

有关argparse错误的更多信息。向上投票这个答案似乎有助于提高Python bug队列中的紧迫性。更新:由于“兼容性”原因,修复已被还原:-猜测此错误将在ForeVersion Python 3.7上生存
required
可以用作参数:
parser.add_subparsers(dest='cmd',required=True)
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