使用argparse实现像samtools一样的子命令,子程序并形成各自的帮助文档

文章目录

    • 简介
      • 使用add_subparsers()来创建子文档
      • 使用set_default()来管理各自功能的参数

简介

很多时候,我们的程序往往需要实现多个功能块,将这些功能块分开实现是一个好主意,而argparse可以帮助我们来实现易读的自命令和帮助文档。
本文将介绍如何使用argparse来对具有多个功能的程序进行功能划分并写出各自子程序的帮助文档。参考文档为argparsehttps://docs.python.org/3/library/argparse.html官方文档

使用add_subparsers()来创建子文档

我们在创建了argparse.ArgumentParser()实例之后,就可以通过add_subparsers()来添加子命令了,add_subparsers()仅有一个方法,add_parser(),该方法可以用来创建子命令。而add_subparsers()也有一些可选的参数,例如title和description以及help来调整子命令帮助内容的显示。我们来看一个简单的例子

import argparse
parser = argparse.ArgumentParser(
                                 prog='subparser_test'
)
subparsers = parser.add_subparsers(title='subcommands',
                      description='valid subcommands',
                      help='additional help'
)
foo_function = subparsers.add_parser('foo',help='foo subcommand')
foo_function.add_argument('x', type=int, help='an integer')
foo_function.add_argument('y', type=int, help='another integer')
bar_function = subparsers.add_parser('bar',help='bar subcommand')
bar_function.add_argument('a', type=str, help='a help')

通过上述的代码,我们已经创建了两个子命令,一个叫foo,一个叫bar,接下来我们就可以看一下我们的程序的帮助命令了

parser.print_help()#打印帮助文档
usage: subparser_test [-h] {foo,bar} ...

optional arguments:
  -h, --help  show this help message and exit

subcommands:
  valid subcommands

  {foo,bar}   additional help
    foo       foo subcommand
    bar       bar subcommand

可以看到,出现了两个自命令,一个是foo,一个是bar,接下来让我们看一下子命令自己的帮助内容

parser.parse_args('foo -h'.split())#解析foo -h参数,解析的内容需要是列表形式,
#这种方式识别命令行参数与不加任何内容在终端中输入参数效果一致。
usage: subparser_test foo [-h] x y

positional arguments:
  x           an integer
  y           another integer

optional arguments:
  -h, --help  show this help message and exit

可以看到,当我们输入foo -h的时候,就会只显示foo子命令的帮助内容了!

使用set_default()来管理各自功能的参数

还有一个很重要的问题,虽然帮助内容好看了,但是各个子命令有各自不同的参数,每一次输入我们都得判断这些参数是属于哪个子命令的,这就比较麻烦了,好在argparse给我们提供了set_default()这个方法来将各个子命令的参数交给各个子命令的程序执行。
现在假设我们的子命令程序如下:

def foo(args):
    print('x arg is {}'.format(args.x))
    print('y arg is {}'.format(args.y))
def bar(args):
    print('a arg is {}'.format(args.a))

我们想要将各自的参数添加到这些子函数中去,因此我们加入了一些新的代码,如下所示:

import argparse
parser = argparse.ArgumentParser(
                                 prog='subparser_test'
)
subparsers = parser.add_subparsers(title='subcommands',
                      description='valid subcommands',
                      help='additional help'
)
foo_function = subparsers.add_parser('foo',help='foo subcommand')
foo_function.add_argument('x', type=int, help='an integer')
foo_function.add_argument('y', type=int, help='another integer')
foo_function.set_defaults(func=foo)

bar_function = subparsers.add_parser('bar',help='bar subcommand')
bar_function.add_argument('a', type=str, help='a help')
bar_function.set_defaults(func=bar)

args = parser.parse_args()
args.func(args)
  

这一次,当我们运行如下命令的时候,就会自动识别参数需要交给哪个子命令来执行了!

args = parser.parse_args('foo 1 2'.split())
args.func(args)
x arg is 1
y arg is 2

终于大功告成了!

你可能感兴趣的:(Python)