相关疑难解决方法(0)

如何在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()
Run Code Online (Sandbox Code Playgroud)

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

tester.py  --verbose 3 car --boo 1 --foo 2
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果

Namespace(boo='1', foo='2', parser_name='car', verbose=3)
Run Code Online (Sandbox Code Playgroud)

我想要的是来自每个subparser的值在一个单独的命名空间或dict中,类似于

Namespace(subparseargs={boo:'1', foo:'2'}, parser_name='car', verbose=3)
Run Code Online (Sandbox Code Playgroud)

这样来自每个subparser的参数与主解析器中的参数逻辑分离(如verbose本例所示).

我怎样才能实现这一点,在同一名称空间中使用每个subparser的参数(subparseargs在示例中).

python python-2.7 argparse

9
推荐指数
1
解决办法
2985
查看次数

使用 Python/argparse 创建可组合/分层的命令行解析器

(问题的简化形式。)我正在编写一个涉及一些 Python 组件的 API。这些可能是函数,但为了具体起见,我们假设它们是对象。我希望能够从命令行解析各种组件的选项。

from argparse import ArgumentParser

class Foo(object):
    def __init__(self, foo_options):
        """do stuff with options"""

    """..."""

class Bar(object):
    def __init__(sef, bar_options):
        """..."""

def foo_parser():
    """(could also be a Foo method)"""
    p = ArgumentParser()
    p.add_argument('--option1')
    #...
    return p

def bar_parser(): "..."
Run Code Online (Sandbox Code Playgroud)

但现在我希望能够构建更大的组件:

def larger_component(options):
    f1 = Foo(options.foo1)
    f2 = Foo(options.foo2)
    b  = Bar(options.bar)
    # ... do stuff with these pieces
Run Code Online (Sandbox Code Playgroud)

美好的。但是如何编写合适的解析器呢?我们可能希望像这样:

def larger_parser(): # probably need to take some prefix/ns arguments
    # general options to be overridden by p1, …
Run Code Online (Sandbox Code Playgroud)

python composition command-line-arguments argparse

5
推荐指数
1
解决办法
1544
查看次数