argparse.ArgumentParser() 用法解析

声明

本文借阅了各网站大佬的经验,已将原文附 Reference 部分,再此表达最诚挚的谢意,如有侵权,本人立即删除!

  • argparse 模块

  1. argparse 是一个 Python 模块:命令行选项、参数和子命令解析器。

  2. argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。

  • 使用流程

    1. 创建解析器

    parser = argparse.ArgumentParser(description='Process some integers.')
    

    使用 argparse 的第一步是创建一个 ArgumentParser 对象。
    ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。

    2. 添加参数

    parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
    

    给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument() 方法完成的。

    3. 解析参数

    >>> parser.parse_args(['--sum', '7', '-1', '42'])
    Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
    

    ArgumentParser 通过 parse_args() 方法解析参数。

  • ArgumentParser 对象

    class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)
    
    • prog - 程序的名称(默认:sys.argv[0])
    • usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
    • description - 在参数帮助文档之前显示的文本(默认值:无)
    • epilog - 在参数帮助文档之后显示的文本(默认值:无)
    • parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
    • formatter_class - 用于自定义帮助文档输出格式的类
    • prefix_chars - 可选参数的前缀字符集合(默认值:’-’)
    • fromfile_prefix_chars - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None)
    • argument_default - 参数的全局默认值(默认值: None)
    • argument_default - 参数的全局默认值(默认值: None)
    • add_help - 为解析器添加一个 -h/–help 选项(默认值: True)
    • allow_abbrev - 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)
  • 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 - 当参数在命令行中出现时使用的动作基本类型。
    • nargs - 命令行参数应当消耗的数目。
    • const - 被一些 action 和 nargs 选择所需求的常数。
    • default - 当参数未在命令行中出现时使用的值。
    • default - 当参数未在命令行中出现时使用的值。
    • choices - 可用的参数的容器。
    • required - 此命令行选项是否可省略 (仅选项可用)。
    • help - 一个此选项作用的简单描述。
    • metavar - 在使用方法消息中使用的参数值示例。
    • dest - 被添加到 parse_args() 所返回对象上的属性名。

实例分析

1. 基本使用

       ~~~~~~        当我们执行某个 Python 代码,例如文件 mycode.py 时,想要传递一些可以随时改变的自定义的参数。比如在训练神经网络的时候,我们为了方便修改训练的 batch 大小,epoch 的大小等等,往往不想去动代码。此时最方便的方法就是在执行代码的时候从命令行传入参数。argparse.ArgumentParser() 可以很好地满足这一需求。

import argparse
 
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
args = parser.parse_args()
print(args.square**2)

       ~~~~~~        改代码首先创建一个 ArgumentParser 对象,添加参数 square,最后采用方法 parser.add_argument。每添加一个参数,就需要调用一次该方法。args = parser.parse_args() 则是使得改代码生效。执行这段代码时,我们在命令行输入

在这里插入图片描述

python mycode.py 9

可以得到输出结果是 9 的平方,即 81。

当然,添加多个参数时,执行的时候顺序输入这些参数。例如 mycode.py 中是如下代码:

import argparse
 
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
parser.add_argument("number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)

我们在命令行输入:

python mycode.py 20 999

输出:

400
999

2. parser.print_help()

argparse.ArgumentParser():创建对象

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument("square", help="display a square of a given number", type=int)
parser.add_argument("number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)
parser.print_help()

其中 parser.print_help() 的功能是我们创建的 parser 的相关信息。命令行输入:

400
999
usage: day1.py [-h] square number

PyTorch MNIST pruning from deep compression paper

positional arguments:
  square      display a square of a given number
  number      display a given number

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

可以看到,description 中的文字也得到了输出。

parser.add_argument():添加参数
parser.add_argument():可配置的参数比较多,第一个是name,也就是名称。前面的例子中,我们用了

parser.add_argument("square", help="display a square of a given number", type=int)

3. name 参数

       ~~~~~~        其中 “square” 就是传递给 name 的参数(也可以单引号的 ’square’ )。这里还有个 help 参数,他和argparse.ArgumentParser() 中的 description 类似,没有实际作用,起到一个注释的作用,会在 parser.print_help() 后打印出来。而显然 type 参数指定了输入参数的类型,int 是整数,float 是浮点,str 是字符串。
   回到 name 参数,他除了可以直接用上面的 square 字符串,也可以一个横杠加字符串以及两个横杠加字符串,例如 ’-sqaure’ 和 ’–square’ 。常见的是两个横杠的写法。下面来说说我个人发现的区别。没有横杠的写法,如我们前面所示,在命令行传入参数的时候,不需要重写名字,直接输入参数:

python mycode.py 20 999

但是假如使用两个横杠的 name,直接传入参数会报错,需要在传入参数的时候重写 name。例如下列代码

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument("--square", help="display a square of a given number", type=int)
parser.add_argument("--number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)

命令行执行时需要

python mycode.py --square 20 --number 999

另外一个需要提到的点是name的取名时,字符串中的横杠和下划线似乎是等价的。例如

parser.add_argument('--batch_size', type=int, default=50)

parser.add_argument('--batch-size', type=int, default=50)

是等价的。但是传递参数的时候,name是横杠也得用横杠;name是下划线也得用下划线:

parser.add_argument('--batch_size', type=int, default=50)

$ python mycode.py --batch_size 128

或者

parser.add_argument('--batch-size', type=int, default=50)

$ python mycode.py --batch-size 128

调用的时候统一用下划线:

print(args.batch_size)

个人建议传递 name 的时候还是用下划线别用横杠,方便查找。这里 default 用于定义没有传递参数时,该参数的默认值。需要注意的是,name 参数用横杠的名称的时候设置default 值,命令行执行程序的时候可以不传入参数或者传入部分参数,没传入的参数使用默认值;name 参数用没有横杠的名称的时候,必须传入参数。

4. action 参数

下面的 parser.add_argument() 用到了 action 参数:

parser.add_argument('--no-cuda', action='store_true',help='disables CUDA training')

action='store_true’ 表示如果我们在命令行配置这个参数,则该参数为 True;不配置则默认为 False。类似的 action='store_false’ 表示如果我们在命令行配置这个参数,则该参数为 False;不配置则默认为 True。配置 action 类型的参数不需要传入具体的数值或者字符串,例如上例中,只需要

python mycode.py ----no-cuda

则表示对该参数进行了配置,他会被设为 True。更多 action 的类型可以参考官方文档

5. metavar 参数

metavar 参数只对用 parser.print_help() 打印参数信息的时候会有影响,并不影响程序的其他功能。例如

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument('--batch_size', type=int, default=50, 
                    help='input batch size for training (default: 50)')
args = parser.parse_args()
parser.print_help()

打印结果为:

usage: day1.py [-h] [--batch_size BATCH_SIZE]

PyTorch MNIST pruning from deep compression paper

optional arguments:
  -h, --help            show this help message and exit
  --batch_size BATCH_SIZE
                        input batch size for training (default: 50)

假如设置 metavar 参数:

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument('--batch_size', type=int, default=50, metavar='N',
                    help='input batch size for training (default: 50)')
args = parser.parse_args()
parser.print_help()

打印结果为

usage: day1.py [-h] [--batch_size N]

PyTorch MNIST pruning from deep compression paper

optional arguments:
  -h, --help      show this help message and exit
  --batch_size N  input batch size for training (default: 50)

可见,只是改变了一些参数的显示。

6. nagrs 参数

为传递多个参数,可以用 nagrs。当 nargs 为 1 时,有且只能传入一个参数:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--one', nargs=1, required=True)
args = parser.parse_args()
print(args.one)

输出

python mycode.py --one  1
['1']

当 nargs 为其他数值,例如3时,表示必须传入3个参数:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--three', nargs=3, required=True)
args = parser.parse_args()
print(args.three)

输出

python mycode.py --three  1 2 3
['1', '2', '3']

当设置了 nargs 参数,则输出是一个 list。

7. dest 参数

dest 参数可以改变 argparse.ArgumentParser() 对应的参数调用时候的名称。例如下面这一段

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

如果第二个参数没有 dest=‘accumulate’,则在调用的时候,最后一行代码只能是

print(args.sum(args.integers))

dest 使得它在调用的时候被改名。但要注意在命令行传入参数的时候仍然是用name的字符串,即–sum。

Reference

[1] 官方文档

[2] 命令行传递参数 argparse.ArgumentParser解析

[3] argparse.ArgumentParser()用法解析

你可能感兴趣的:(#,Python,python,人工智能,开发语言)