python 有没有办法在argparse中添加一个已经创建的解析器作为子解析器?

5vf7fwbs  于 2023-02-02  发布在  Python
关注(0)|答案(4)|浏览(178)

通常,要在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()创建的解析器作为子解析器,这可能吗?

l7wslrjt

l7wslrjt1#

您可以使用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不会定义两次。

kq4fsx7k

kq4fsx7k2#

您可能想看一看shlex模块,因为在我看来,您似乎是在尝试破解ArgumentParser,以完成它实际上并不打算完成的任务。
话虽如此,但如果没有示例来说明您要解析的内容,要找出一个好的答案还是有点困难的。

8dtrkrch

8dtrkrch3#

我想你的问题可以通过一个声明性的argparse Package 器来解决,我写的这个 Package 器叫做Argh,它可以帮助把命令的定义(包括所有与参数相关的东西)与组装(包括子解析器)和调度分离开来。

vfhzx4xs

vfhzx4xs4#

这是一个很老的问题,但是我想提出另一个选择,那就是从控制反转的Angular 来考虑,我的意思是根ArgumentParser将管理子解析器的创建:

# root_argparser.py
from argparse import ArgumentParser, Namespace

__ARG_PARSER = ArgumentParser('My Script')
__SUBPARSERS = __ARG_PARSER.add_subparsers(dest='subcommand')
__SUBPARSERS.required = True

def get_subparser(name: str, **kwargs) -> ArgumentParser:
    return __SUBPARSERS.add_parser(name, **kwargs)

def parse_args(**kwargs) -> Namespace:
    return __ARG_PARSER.parse_args(**kwargs)
# my_script.py
from argparse import ArgumentParser
from root_argparse import get_subparser

__ARG_PARSER = get_subparser('script')
__ARG_PARSER.add_argument('--foo')
__ARG_PARSER.add_argument('--bar')

def do_stuff(...):
    ...
# main.py
from root_argparse import parse_args
import my_script

if __name__ == '__main__':
   args = parse_args()
   # do stuff with args

从我做的一些快速测试来看似乎工作正常。

相关问题