python - 带有所需子解析器的 Argparse

标签 python python-3.x python-2.7 argparse

我正在使用 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://stackoverflow.com/a/22994500/3061818 中的建议设置 required 属性,但是这给了我 Python 3.4.0 的错误:TypeError: sequence item 0: expected str instance, NoneType found - full tr​​aceback:

$ 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?

最佳答案

你需要给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

关于python - 带有所需子解析器的 Argparse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23349349/

相关文章:

python - 根据多个条件对字典中的值求和

python - python 2.x中不可避免的 'encoding is an invalid keyword'错误吗?

python - 从 pyqtgraph.Qt 导入 QtGui 作为 *

python - 删除 pandas 数据框中出现次数少于 N 次的所有与索引匹配的值

python - 阻止 GitPython 在尝试克隆不存在的远程存储库时询问凭据

python - 从/使用函数参数作为键和默认值作为值创建字典

Python 除以 10

python - 我可以按内存位置对 python 中的列表元素进行排序(排序)吗?

python - 如何指定 dateparser 解析以将 dd/mm/yyyy 视为默认值而不是 mm/dd/yyyy

python-2.7 - python 上的 libspatialindex 和 Rtree