Python | import argparse模块的使用

我们在写python脚本的时候,有时候需要在运行的时候传入参数,而不是写死在程序里,这个时候就要用到argparse模块。

argparse 模块是 Python 内置的用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。

使用步骤

我们常常可以把argparse的使用简化成下面四个步骤

  1. import argparse

  2. parser = argparse.ArgumentParser()

  3. parser.add_argument()

  4. parser.parse_args()

上面四个步骤解释如下:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用。

例子:

# 导入库
import argparse

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

# 2. 添加命令行参数
parser.add_argument('--epochs', type=int, default=30)
parser.add_argument('--batch', type=int, default=4)

# 3. 从命令行中结构化解析参数
args = parser.parse_args()
print(args) # Namespace(batch=4, epochs=30)
epochs = args.epochs
batch = args.batch
print('show {}  {}'.format(epochs, batch)) # show 30  4

代码解读:首先我们导入argparse这个包,然后包中的ArgumentParser类生成一个parser对象(其中的description对参数解析器的作用进行描述),当我们在命令行显示帮助信息的时候会看到description描述的信息。

运行结果:

Namespace(batch=4, epochs=30)
show 30  4

参数详解

1.argparse.ArgumentParser()方法

argparse 模块提供了 ArgumentParser 类来解析命令行参数。下面是 ArgumentParser 类中可用的主要参数:

  • prog:程序的名称,默认为 sys.argv[0],即当前脚本文件的名称。
  • usage:程序的使用帮助信息,当用户在命令行中输入 -h--help 参数时显示。
  • description:程序的描述信息,显示在使用帮助信息之前。
  • epilog:程序的结束语信息,显示在使用帮助信息之后。
  • parents:一个包含 ArgumentParser 对象的列表,这些对象中的参数将被包括在当前对象中。
  • formatter_class:用于指定帮助信息的格式化类,默认为 argparse.HelpFormatter
  • prefix_chars:用于指定命令行参数的前缀字符,默认为 '-'
  • fromfile_prefix_chars:用于指定从文件中读取参数值的前缀字符,默认为 None
  • argument_default:用于指定参数的默认值,默认为 None
  • conflict_handler:用于处理不同参数之间的冲突,默认为 'error',表示遇到冲突时抛出异常。
  • add_help:用于指定是否将 -h--help 参数添加到命令行参数中,默认为 True

2.add_argument() 方法

(1)add_argument() 方法参数快速解释

add_argument() 方法定义如何解析命令行参数:

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
每个参数解释如下:

name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
action - 命令行遇到参数时的动作,默认值是 store。
store_const,表示赋值为const;
append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
append_const,将参数规范中定义的一个值保存到一个列表;
count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
const - action 和 nargs 所需要的常量值。
default - 不指定参数时的默认值。
type - 命令行参数应该被转换成的类型。
choices - 参数可允许的值的一个容器。
required - 可选参数是否可以省略 (仅针对可选参数)。
help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

(2)add_argument() 方法参数详细解释

给一个 ArgumentParser 添加程序参数信息,是通过调用 add_argument() 方法完成的。通常,这些调用指定 ArgumentParser 如何获取命令行字符串并将其转换为对象。这些信息在 parse_args() 调用时被存储在ArgumentParser实例化对象中,以供后续使用。add_argument() 方法定义如何解析命令行参数的呢?

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

每个参数解释如下:

  • name or flags: 普通参数或flag参数选项参数的名称或标签,例如 epochs 或者 -e, --epochs。Flag参数不需要指定参数值,只需要带有参数名即可。

  • action: 命令行遇到flags参数时的动作。有两个常见的动作,store_true:设定flag参数为true;store_false:设定flag参数为False。注意:如果直接运行程序,默认不读取该变量,要使用必须要进行传参,例如:python try.py --epochs

  • nargs: 设置参数在使用可以提供的个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。

parser.add_argument('-name', nargs=x)

其中x的候选值和含义如下:

含义
N 参数的绝对个数(例如:3)
‘?’ 0或1个参数
‘’*’ 0或所有参数
‘+’ 所有,并且至少一个参数

如:

# file-name: nargs.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='nargs demo')
    parser.add_argument('-name', required=True, nargs='+')

    return parser


if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    names = ', '.join(args.name)
    print('Hello to {}'.format(names))

执行命令和结果如下:

$ python nargs.py -name A B C
Hello to A, B, C
  • default: 不指定参数时该参数的默认值。default表示命令行没有设置该参数的时候,程序中用什么值来代替。

  • type: 命令行参数应该被转换成的数据类型。默认的参数类型是str类型,如果你的程序需要一个整数或者布尔型参数,你需要设置type=inttype=bool

如:

#name: square.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='Calculate square of a given number')
    parser.add_argument('-number', type=int)

    return parser


if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    res = args.number ** 2
    print('square of {} is {}'.format(args.number, res))

运行结果:

$ python square.py -number 5
square of 5 is 25
  • required: 是否为必选参数或可选参数。如果设置了required=True,则在实际运行的时候不设置该参数将报错。
...
parser.add_argument('-name', required=True)
...

运行下面的命令会报错:

$ python print_name.py
usage: print_name.py [-h] --name NAME
print_name.py: error: argument --name is required
  • help: 指定参数的帮助信息。

在现实帮助信息的时候,help参数的值可以给使用工具的人提供该参数是用来设置什么的说明,对于大型的项目,help参数和很有必要的,不然使用者不太明白每个参数的含义,增大了使用难度。

如:

# file-name: help.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='help demo')
    parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'],
        help='the architecture of CNN, at this time we only support alexnet and vgg.')

    return parser


if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    print('the arch of CNN is '.format(args.arch))

在命令行加-h--help参数运行该命令,获取帮助信息的时候,结果如下:

$ python help.py -h
usage: help.py [-h] -arch {alexnet,vgg}

choices demo

optional arguments:
  -h, --help           show this help message and exit
  -arch {alexnet,vgg}  the architecture of CNN, at this time we only support
                       alexnet and vgg.
  • metavar: 在 usage 说明中的参数名称,对于必选参数,默认就是参数名称,对于可选参数默认是全大写的参数名称。

  • dest: 解析后的参数名称,也就是设置参数在代码中的变量名。默认情况下,对于可选参数选取最长的名称,中划线转换为下划线,也就是---后面的字符串。但是你也可以通过dest=xxx来设置参数的变量名,然后在代码中用args.xxx来获取参数的值。

  • choices: 参数可允许的值的一个容器。

如:

# file-name: choices.py
import argparse

def get_parser():
    parser = argparse.ArgumentParser(
        description='choices demo')
    parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'])

    return parser

if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args()
    print('the arch of CNN is '.format(args.arch))

如下执行会报错:

$ python choices.py -arch resnet
usage: choices.py [-h] -arch {alexnet,vgg}
choices.py: error: argument -arch: invalid choice: 'resnet' (choose from 'alexnet', 'vgg')

因为我们所给的-arch参数resnet不在备选的choices之中,所以会报错。

  • const: action 和 nargs 所需要的常量值。

  • store_const:表示赋值为const;

  • append:将遇到的值存储成列表,也就是如果参数重复则会保存多个值;

  • append_const:将参数规范中定义的一个值保存到一个列表;

  • count:存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;

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

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

args = parser.parse_args()

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

posted @ 2023-02-25 21:27  张Zong在修行  阅读(201)  评论(0编辑  收藏  举报