2013-02-20 71 views
4

通常情况下,增加一个子分析器中​​你要做的:有没有办法在argparse中添加已创建的解析器作为子解析器?

parser = ArgumentParser() 
subparsers = parser.add_subparser() 
subparser = subparsers.add_parser() 

我有是我想要添加另一个命令行脚本,用它自己的解析器问题,作为一个子我主要脚本。是否有捷径可寻?


编辑:为了澄清,我有一个文件script.py看起来是这样的:

def initparser(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--foo') 
    parser.add_argument('--bar') 
    return parser 

def func(args): 
    #args is a Namespace, this function does stuff with it 

if __name__ == '__main__': 
    initparser().parse_args() 

所以我可以运行此类似:

python script.py --foo --bar 

我想写一个模块app.py这是一个命令行界面与几个子命令,所以我可以运行类似于:

python app.py script --foo --bar 

而不是将所有initparser()逻辑复制并粘贴到app.py,我希望能够直接使用我从initparser()创建的解析器作为子解析器。这可能吗?

回答

0

您可能想看看shlex模块,因为它听起来像你试图破解ArgumentParser做一些事实上并不打算做的事情。

话虽如此,没有例子说明你正在试图解析的东西,这是一个很难找出一个好的答案。

3

您可以使用parents参数

p=argparse.ArgumentParser() 
s=p.add_subparsers() 
ss=s.add_parser('script',parents=[initparser()],add_help=False) 
p.parse_args('script --foo sst'.split()) 

ss是共享的initparser定义的所有参数的解析器。 ssinitparser需要add_help=False,因此-h未定义两次。

0

我认为你的问题可以通过argparse的声明包装来解决。我写的那个叫做Argh。它有助于分离组装(包括子分析器)和调度的命令定义(包括所有参数相关的东西)。

相关问题