python命令行参数argparse常用命令

1、参数个数控制

parser.add_argument('-i', '--integers', nargs='?', const=100, type=int, help='input a number') 参数nargs: nargs='*'     表示参数可设置0个或多个,参数是一个列表 nargs='+'    表示参数可设置1个或多个,参数是一个列表 nargs='?' 表示参数可设置0个或1个 

1、参数名后面必须跟值的情况
1)没有配置nargs
2)设置了nargs='+'

2、使用参数但不跟值的条件
使用nargs='?', 且添加const设定一个参数值。

3、使用时不显式掉用参数但给参数赋默认值
添加default属性即可。
例如:

import argparse  parser = argparse.ArgumentParser(description='This is a parse demo')  parser.add_argument('-i', '--integers', nargs='?', const=10, default=100, type=int, help='input a number')  args = parser.parse_args()  print(args.integers)  # 显式调用 $ python t3.py  -i 1 1 # 使用const属性 $ python t3.py  -i 10 # 使用参数的默认值 $ python t3.py 100 

4、action--命令行参数与动作相关联
action 命名参数指定了这个命令行参数应当如何处理。

  1. store_[true, false]
    不需要跟参数值,用法: parser.add_argument('--foo', action='store_true'), 如果调用--foo则其值为true。
  2. store_const
    如果使用该命令选项则其值为const指定的值,用法:parser.add_argument('--foo', action='store_const', const=42)。
  3. store_append
    append存储一个列表,并将每个参数值附加到列表中。用法:parser.add_argument('--foo', action='append')。
    常用的组合如默认为False,当指定了此命令则属性为True。
    parser.add_argument('--foo', action='store_true', default=False)

2、参数互斥

如果希望两个或多个参数互斥。可以使用argparse.ArgumentParser.add_mutually_exclusive_group() 功能.
1、参数组
了解互斥之前先看下参数组(group),group功能可以把参数分为不同的组,以更加清晰的方式显示参数信息。

import argparse  parser = argparse.ArgumentParser(description='This is a parse demo')   group1 = parser.add_argument_group('group1', 'group1 description') group1.add_argument('--foo', help='foo help') group1.add_argument('--foo2', help='foo1 help') group2 = parser.add_argument_group('group2', 'group2 description') group2.add_argument('--bar', help='bar help') group2.add_argument('--bar2', help='bar2 help')  args = parser.parse_args()  print(args)  # 测试 $ python t3.py -h usage: t3.py [-h] [--foo FOO] [--foo2 FOO2] [--bar BAR] [--bar2 BAR2]  This is a parse demo  optional arguments:   -h, --help   show this help message and exit  group1:   group1 description    --foo FOO    foo help   --foo2 FOO2  foo1 help  group2:   group2 description    --bar BAR    bar help   --bar2 BAR2  bar2 help 

2、互斥组
创建一个互斥组。 argparse 将会确保互斥组中只有一个参数在命令行中可用。

import argparse  parser = argparse.ArgumentParser(description='This is a parse demo') group = parser.add_mutually_exclusive_group() group.add_argument('--foo', action='store_true') group.add_argument('--bar', action='store_false')  args = parser.parse_args() print(args)  # 测试互斥组 $ python t3.py --foo Namespace(foo=True, bar=True)  $ python t3.py --bar Namespace(foo=False, bar=False)  $ python t3.py --foo --bar usage: t3.py [-h] [--foo | --bar] t3.py: error: argument --bar: not allowed with argument --foo 

3、子命令

在代码功能较多时,使用子命令可以把相关的小功能合并为一类命令,然后用二级参数进一步精细控制。这样能让代码更加模块化,提高可读性同时也便利了使用者调用。例如git的commit就是一个子命令,commit是一个大类命令,而commit本身还有很多二级参数。

import argparse  def add(arguments):     print(f'{arguments.x} + {arguments.y} = {arguments.x + arguments.y}')  def sub(arguments):     print(f'{arguments.x} - {arguments.y} = {arguments.x - arguments.y}')  # create the top-level parser parser = argparse.ArgumentParser(description='This is a parse demo')  subparsers = parser.add_subparsers()  # create the parser for command 'add' add_parser = subparsers.add_parser('add', help='calc add') add_parser.add_argument('-x',  type=int, help='x value') add_parser.add_argument('-y',  type=int, help='y value') add_parser.set_defaults(func=add)  # create the parser for command 'sub' sub_parser = subparsers.add_parser('sub', help='calc sub') sub_parser.add_argument('-x',  type=int, help='x value') sub_parser.add_argument('-y',  type=int, help='y value') sub_parser.set_defaults(func=sub)  args = parser.parse_args()  print(f"print the input: x={args.x}, y={args.y}")  args.func(args) # 跳转到对应的函数  # 测试 $ python t2.py add -x 1 -y=2 print the input: x=1, y=2 1 + 2 = 3  $ python t2.py sub -x 1 -y 2 print the input: x=1, y=2 1 - 2 = -1 

需要注意的是:parse_args只返回主解析器和子命令对应的子解析器的属性,没有其他子命令的解析器,因此上面例子add和sub不可同时调用。也就是说subparser不支持多个子命令同时使用。

参考文献

argparse — Parser for command-line options, arguments and sub-commands — Python 3.8.14 documentation

发表评论

相关文章