python - 如何使用 argparse 在单独的命名空间中使用子解析器参数?

标签 python python-2.7 argparse

我有以下测试代码

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", default = 0, type=int)

subparsers = parser.add_subparsers(dest = "parser_name")

parser_lan = subparsers.add_parser('car')
parser_lan.add_argument("--boo")
parser_lan.add_argument("--foo")

parser_serial = subparsers.add_parser('bus')
parser_serial.add_argument("--fun")

print parser.parse_args()

它定义了两个子解析器,具有不同的参数集。当我将测试代码称为

tester.py  --verbose 3 car --boo 1 --foo 2

我得到了预期的结果

Namespace(boo='1', foo='2', parser_name='car', verbose=3)

我想要的是来自每个子解析器的值在一个单独的命名空间或字典中,类似于

Namespace(subparseargs={boo:'1', foo:'2'}, parser_name='car', verbose=3)

因此每个子解析器的参数与主解析器的参数在逻辑上是分开的(在这个例子中是verbose)。

如何使用相同命名空间(示例中的subparseargs)中的每个子解析器的参数实现这一点。

最佳答案

您需要深入了解 argparse,但将您的脚本更改为以下内容应该可以解决问题:

import argparse
from argparse import _HelpAction, _SubParsersAction

class MyArgumentParser(argparse.ArgumentParser):
    def parse_args(self, *args, **kw):
        res = argparse.ArgumentParser.parse_args(self, *args, **kw)
        from argparse import _HelpAction, _SubParsersAction
        for x in parser._subparsers._actions:
            if not isinstance(x, _SubParsersAction):
                continue
            v = x.choices[res.parser_name] # select the subparser name
            subparseargs = {}
            for x1 in v._optionals._actions: # loop over the actions
                if isinstance(x1, _HelpAction): # skip help
                    continue
                n = x1.dest
                if hasattr(res, n): # pop the argument
                    subparseargs[n] = getattr(res, n)
                    delattr(res, n)
            res.subparseargs = subparseargs
        return res

parser = MyArgumentParser()
parser.add_argument("--verbose", default = 0, type=int)

subparsers = parser.add_subparsers(dest = "parser_name")

parser_lan = subparsers.add_parser('car')
parser_lan.add_argument("--boo")
parser_lan.add_argument("--foo")

parser_serial = subparsers.add_parser('bus')
parser_serial.add_argument("--fun")

print parser.parse_args()

关于python - 如何使用 argparse 在单独的命名空间中使用子解析器参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782948/

相关文章:

python - 如何在 Python 中生成只有 'x' ,'y' 和给定长度 n 的回文列表?

python - 如何在python递归函数中保留列表或字典?

python - 如何使用python脚本将sql.gz文件导入mysql数据库?

python - 使用 Python 模块 argparse 的单个选项的自定义值名称和多个属性

Python argparse 可选参数仅在输入正确位置时才有效

python - 如何提取图像的边界(OCT/视网膜扫描图像)

python - 计算利率 Python Dataframe

python-2.7 - 在 matplotlib 中更改颜色图的字体大小

pandas - 如何使用 Python Pandas 执行三变量相关

python - argparse 与选项一起使用,而不是参数