Python -- argparse :命令行参数解析模块

Python – argparse :命令行参数解析模块

官网参考文档

文章目录

      • Python -- argparse :命令行参数解析模块
        • 1. 总述
        • 2. `add_argument()`
          • 2.1 name or flags
          • 2.2 action
          • 2.3 nargs
          • 2.4 default
          • 2.5 type
        • 3. parse_args() :解析命令行的参数
        • 4. 脚本中使用命令行参数

1. 总述

argparse模块提供了程序与命令行的接口,通过使用argparse模块可以对传入程序的参数进行定义,规定、限制等操作。其总体操作可分为以下四个步骤:

  1. 导入argparse, import argparse.
  2. 创建一个命令行解析器对象:parser = argparse.ArgumentParser()
  3. 在解析器对象中添加命令行参数和参数的相关属性:调用add_argument()函数,重点。
  4. 解析命令行的参数:使用args = parser.parse_args()即可获得传入的命令行参数。

前两步较为简单,如下代码中先创建个解析器对象,以便于下文介绍add_argument()函数。

# 导入库
import argparse
 
# 1. 定义命令行解析器对象
parser = argparse.ArgumentParser(description='Demo of argparse')

2. add_argument()

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

如上,add_argument中包含必传参数name or flags以及多个可选参数,下面介绍常用参数的含义和实例:

2.1 name or flags

该参数确定了添加的命令行参数是可选的参数还是必须传入的(位置参数positional arguments)。若是可选的,则add_argument()的第一个参数必须是一个flag或则一系列flags 如'--foo','-f'; 反之若是必须的,则add_argument()的第一个参数需要是给该命令行参数定义的名字。见下代码:

# 添加可选参数
>>> parser.add_argument('-f', '--foo') 
# 添加必要参数 ,命名为'bar'
>>> parser.add_argument('bar') 
>>> parser.parse_args(['BAR'])  # 进行解析传入'bar'参数
Namespace(bar='BAR', foo=None)  # 此时没有传入foo参数所以为none
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO']) # 当不传入必要参数时会报错!!!
usage: [-h] [-f FOO] bar
: error: the following arguments are required: bar

由上也可知当调用parse_args时(即传入命令行参数时),可选参数前需要加上其对应的flag,剩下的参数都会依次默认为对应顺序的必选参数。

2.2 action

action参数明确了收到命令行参数后应该进行怎样的处理。其可选参数有[‘store’, ‘store_const’, ‘store_true’, ‘store_false’, ‘append’, ‘append_const’, ‘count’, ‘help’, ‘version’, ‘extend’]

下文介绍常用的几个选项,其他具体实例可参考文章开头的官网链接。

  • store, 保存命令行参数的值。这是action的默认选项。

  • store_truestore_false: 会自动生成对应的True和False默认值, 在命令行指定该参数名字时会自动将该参数保存为相应的bool值。但若没在命令行中指定,则会保存与action给定的相反的bool值。

    >>> parser.add_argument('--foo', action='store_true')
    >>> parser.add_argument('--bar', action='store_false')
    >>> parser.add_argument('--baz', action='store_false')
    >>> parser.parse_args('--foo --bar'.split())
    # 指定了--foo 和 --bar 这这两个值保存相对应的bool值,baz没有指定则保存相反的bool值
    Namespace(foo=True, bar=False, baz=True)
    
    >>> parser.add_argument('--fff', action='store_true')
    >>> parser.parse_args()
    Namespace(foo=False, bar=True, baz=True, fff=False)
    
  • 可以通过扩展Action类进行自定义action,通过重写__call____init__等进行重构action要实现得功能。如mmcv中扩展的DictAction

2.3 nargs

nargs指定每一个命令行参数需要接收参数的个数。其支持以下值:

  • N : N个命令行参数将会一起组成个列表进行传入该参数。当N指定为1时,也会将单个元素以列表形式返回。

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', nargs=2)
    >>> parser.add_argument('bar', nargs=1)
    >>> parser.parse_args('c --foo a b'.split())
    Namespace(foo=['a', 'b'], bar=['c'])
    
  • '*''+':对应位置的所有命令行参数都会被保存在一个list中,但当传入的参数个数为0时’+‘选项会报错,而’*'不会。

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', nargs='*')
    >>> parser.add_argument('--bar', nargs='*')
    >>> parser.add_argument('baz', nargs='*')
    >>> parser.add_argument('--fff', nargs='+')
    >>> parser.parse_args('a b --foo x y --bar 1 2 --fff 0 0 0'.split())
    Namespace(foo=['x', 'y'], bar=['1', '2'], baz=['a', 'b'], fff=['0', '0', '0'])
    # 当指定--bar, 但不传入参数时,不会报错,会报错空列表
    >>> parser.parse_args('a b --foo x y --bar'.split())
    Namespace(foo=['x', 'y'], bar=[], baz=['a', 'b'], fff=None)
    
    # 当指定--fff, 但不传入参数时,会产生报错
    >>> parser.parse_args('a b --foo x y --bar 1 2 --fff'.split())
    usage: [-h] [--foo [FOO ...]] [--bar [BAR ...]] [--fff FFF [FFF ...]] [baz ...]
    : error: argument --fff: expected at least one argument
    
  • ? : 具体见官网,可用来指定传入文件。

2.4 default

当可选参数和位置参数没有在命令行指定时,default会指定其在程序中使用的值。对于可选参数,当该参数没有在命令行指定时,则会使用default中的值。对于位置参数,则需要配合nargs='?'一起使用,此时当命令行没有指定该位置参数时,会默认为default中定义的值。default的值默认为None.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)

# 位置参数,配合nargs=‘?’使用
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args(['a'])
Namespace(foo='a')
>>> parser.parse_args([])
Namespace(foo=42)
2.5 type

默认接受的命令行参数都是字符串,当我们需要转换类型时,可以指定type.如指定为int和float类型。

3. parse_args() :解析命令行的参数

ArgumentParser对象通过 parse_args() 方法解析命令行的参数。它将检查命令行中每个参数,转换为适当的数据类型,然后调用相应的操作,并把参数结构化后存放在对象args中。

args = parser.parse_args()

在脚本中,通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数。

4. 脚本中使用命令行参数

使用args调用参数包含的数据,如args.foo便可以调用foo命令行传入的参数的数据。

更新中…

你可能感兴趣的:(python,开发语言,python)