• argparse.ArgumentParser() 用法解析


    声明

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

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

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

    • 使用流程

      1. 创建解析器

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

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

      2. 添加参数

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

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

      3. 解析参数

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

      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)
      
      • 1
      • 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])
      
      • 1
      • 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    在这里插入图片描述

    python mycode.py 9
    
    • 1

    可以得到输出结果是 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们在命令行输入:

    python mycode.py 20 999
    
    • 1

    输出:

    400
    999
    
    • 1
    • 2

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    其中 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

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

    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
    
    • 1

    但是假如使用两个横杠的 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    命令行执行时需要

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

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

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

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

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

    parser.add_argument('--batch_size', type=int, default=50)
    
    $ python mycode.py --batch_size 128
    
    • 1
    • 2
    • 3

    或者

    parser.add_argument('--batch-size', type=int, default=50)
    
    $ python mycode.py --batch-size 128
    
    
    • 1
    • 2
    • 3
    • 4

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

    print(args.batch_size)
    
    • 1

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

    4. action 参数

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

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

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

    python mycode.py ----no-cuda
    
    • 1

    则表示对该参数进行了配置,他会被设为 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    打印结果为:

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    假如设置 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    打印结果为

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出

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

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

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--three', nargs=3, required=True)
    args = parser.parse_args()
    print(args.three)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出

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

    当设置了 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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    print(args.sum(args.integers))
    
    • 1

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

    Reference

    [1] 官方文档

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

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

  • 相关阅读:
    EtherCAT主站转Ethernet/IP网关
    直流有刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)
    MVC第三波书店用户Model
    java根据word模板生成文档(含文本替换和动态生成表格)
    小程序之自定义组件 结合案例(会议OA的会议/投票管理及个人中心的搭建)详解 (4)
    前端面试问题汇总 - 工程管理工具篇
    Taro+react问题集合
    代码随想录1刷—字符串篇
    HJ20 密码验证合格程序--Javascript V8
    关于文件上传的前后端优化
  • 原文地址:https://blog.csdn.net/qq_46450354/article/details/126805457