通常,要在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()创建的解析器作为子解析器,这可能吗?
4条答案
按热度按时间l7wslrjt1#
您可以使用
parents
参数ss
是共享为initparser
定义的所有参数的解析器。ss
或initparser
上需要add_help=False
,因此-h
不会定义两次。kq4fsx7k2#
您可能想看一看shlex模块,因为在我看来,您似乎是在尝试破解
ArgumentParser
,以完成它实际上并不打算完成的任务。话虽如此,但如果没有示例来说明您要解析的内容,要找出一个好的答案还是有点困难的。
8dtrkrch3#
我想你的问题可以通过一个声明性的argparse Package 器来解决,我写的这个 Package 器叫做Argh,它可以帮助把命令的定义(包括所有与参数相关的东西)与组装(包括子解析器)和调度分离开来。
vfhzx4xs4#
这是一个很老的问题,但是我想提出另一个选择,那就是从控制反转的Angular 来考虑,我的意思是根
ArgumentParser
将管理子解析器的创建:从我做的一些快速测试来看似乎工作正常。