美文网首页
Argparse使用说明

Argparse使用说明

作者: pipizhou | 来源:发表于2019-02-13 12:29 被阅读0次

    介绍

    写train.py的时候,一般情况需要从命令行读入参数,经常用到argparse,在这里以实用代码为例写一些使用说明。

    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.optim import lr_scheduler
    from torch.autograd import Variable
    import torch.nn.initasinit
    from torchvision import models, transforms
    from torch.utils.data import Dataset, DataLoader
    from torch.nn import DataParallel
    import os
    from PIL import Image, ImageOps
    import time
    import pickle
    import numpy as np
    from torchvision.transforms import Lambda
    import argparse
    import copy
    import random
    import numbers
    
    parser = argparse.ArgumentParser(description=' c3d training')
    parser.add_argument('-g','--gpu',default=[2],nargs='+',type=int,help='index of gpu to use, default 2')
    parser.add_argument('-s','--seq',default=4,type=int,help='sequence length, default 4')
    parser.add_argument('-t','--train',default=100,type=int,help='train batch size, default 100')
    parser.add_argument('-v','--val',default=8,type=int,help='valid batch size, default 8')
    parser.add_argument('-o','--opt',default=1,type=int,help='0 for sgd 1 for adam, default 1')
    parser.add_argument('-m','--multi',default=1,type=int,help='0 for single opt, 1 for multi opt, default 1')
    parser.add_argument('-e','--epo',default=25,type=int,help='epochs to train and val, default 25')
    parser.add_argument('-w','--work',default=2,type=int,help='num of workers to use, default 2')
    parser.add_argument('-f','--flip',default=0,type=int,help='0 for not flip, 1 for flip, default 0')
    parser.add_argument('-c','--crop',default=1,type=int,help='0 rand, 1 cent, 5 five_crop, 10 ten_crop, default 1')
    parser.add_argument('-l','--lr',default=1e-3,type=float,help='learning rate for optimizer, default 1e-3')
    parser.add_argument('--momentum',default=0.9,type=float,help='momentum for sgd, default 0.9')
    parser.add_argument('--weightdecay',default=0,type=float,help='weight decay for sgd, default 0')
    parser.add_argument('--dampening',default=0,type=float,help='dampening for sgd, default 0')
    parser.add_argument('--nesterov',default=False,type=bool,help='nesterov momentum, default False')
    parser.add_argument('--sgdadjust',default=1,type=int,help='sgd method adjust lr 0 for step 1 for min, default 1')
    parser.add_argument('--sgdstep',default=5,type=int,help='number of steps to adjust lr for sgd, default 5')
    parser.add_argument('--sgdgamma',default=0.1,type=float,help='gamma of steps to adjust lr for sgd, default 0.1')
    args=parser.parse_args()
    
    gpu_usg=",".join(list(map(str, args.gpu)))
    sequence_length = args.seq
    train_batch_size = args.train
    val_batch_size = args.val
    optimizer_choice = args.opt
    multi_optim = args.multi
    epochs = args.epo
    workers = args.work
    use_flip = args.flip
    crop_type = args.crop
    learning_rate = args.lr
    momentum = args.momentum
    weight_decay = args.weightdecay
    dampening = args.dampening
    use_nesterov = args.nesterov
    sgd_adjust_lr = args.sgdadjust
    sgd_step = args.sgdstep
    sgd_gamma = args.sgdgamma
    

    add_argument 说明

    • 添加位置参数—— positional arguments: "echo"

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("echo", help="echo the string you use here")
    args = parser.parse_args()
    print(args.echo)
    

    效果:--help(短选项写为-h)是唯一一个内置的选项参数,用于查看帮助信息。

    $ python3 prog.py
    usage: prog.py [-h] echo
    prog.py: error: the following arguments are required: echo
    #########################
    $ python3 prog.py --help
    usage: prog.py [-h] echo
    positional arguments:
      echo        echo the string you use here
    optional arguments:
      -h, --help  show this help message and exit
    #########################
    $ python3 prog.py foo
    foo
    

    对于传入的参数,如果不声明她的类型,就默认当作str型处理。

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

    效果:(如果不声明type = int就会报错)

    $ python3 prog.py 4
    16
    
    • 添加选项参数—— optional arguments

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("--verbosity", help="increase output verbosity")
    args = parser.parse_args()
    if args.verbosity:
        print("verbosity turned on")
    #这个程序中,--verbosity可以被赋予任意整型数值,但是在if判断句中只有True False是有效的
    #于是在后面我们做一些修改,添加了action参数
    

    顾名思义,选项参数不调用不传参数运行也不会报错(选项参数会被赋予default值 --- None);如果在命令行中调用了,例如$ python3 prog.py --verbosity(这里verbosity需要给一个值,如1),则会报错error: argument --verbosity: expected one argument。
    效果:

    $ python3 prog.py --verbosity 1
    verbosity turned on
    $ python3 prog.py
    $ python3 prog.py --help
    usage: prog.py [-h] [--verbosity VERBOSITY]
    
    optional arguments:
      -h, --help            show this help message and exit
      --verbosity VERBOSITY
                            increase output verbosity
    $ python3 prog.py --verbosity
    usage: prog.py [-h] [--verbosity VERBOSITY]
    prog.py: error: argument --verbosity: expected one argument
    

    一些小修改,给内置action参数赋值"store_true"

    parser.add_argument("--verbose", help="increase output verbosity",
                        action="store_true")
    #这个意义是,如果选项参数被调用(不赋值),agrs.verbose就被赋予True
    

    效果:

    $ python3 prog.py --verbose
    verbosity turned on
    $ python3 prog.py --verbose 1 #赋值就会报错,此时--verbose功能等于flag
    usage: prog.py [-h] [--verbose]
    prog.py: error: unrecognized arguments: 1
    $ python3 prog.py --help
    usage: prog.py [-h] [--verbose]
    optional arguments:
      -h, --help  show this help message and exit
      --verbose   increase output verbosity #此时的help信息也与前面不同
    

    对于短选项的使用,就是长选项参数的简写版,添加使用都非常简单:

    parser.add_argument("-v", "--verbose", help="increase output verbosity",
                        action="store_true")
    ################效果##################
    $ python3 prog.py -v
    verbosity turned on
    $ python3 prog.py --help
    usage: prog.py [-h] [-v]
    optional arguments:
      -h, --help     show this help message and exit
      -v, --verbose  increase output verbosity
    
    • 位置参数与选项参数结合使用

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("square", type=int,
                        help="display a square of a given number")
    parser.add_argument("-v", "--verbose", action="store_true",
                        help="increase output verbosity")
    args = parser.parse_args()
    answer = args.square**2
    if args.verbose:
        print("the square of {} equals {}".format(args.square, answer))
    else:
        print(answer)
    

    效果:

    $ python3 prog.py
    usage: prog.py [-h] [-v] square 
    prog.py: error: the following arguments are required: square
    #添加了选项参数square之后,没有赋值--报错  
    $ python3 prog.py 4
    16
    $ python3 prog.py 4 --verbose
    the square of 4 equals 16
    $ python3 prog.py --verbose 4
    the square of 4 equals 16
    #发现选项参数和位置参数在命令行中的位置可以调换,不影响结果
    
    • add_mutually_exclusive_group() 冲突选项处理

    似乎没什么实际作用,主要就是调用--help的时候,usage信息里会给出冲突的选项参数。

    import argparse
    
    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-v", "--verbose", action="store_true")
    group.add_argument("-q", "--quiet", action="store_true")
    parser.add_argument("x", type=int, help="the base")
    parser.add_argument("y", type=int, help="the exponent")
    args = parser.parse_args()
    answer = args.x**args.y
    
    if args.quiet:
        print(answer)
    elif args.verbose:
        print("{} to the power {} equals {}".format(args.x, args.y, answer))
    else:
        print("{}^{} == {}".format(args.x, args.y, answer))
    

    效果:

    $ python3 prog.py 4 2
    4^2 == 16
    $ python3 prog.py 4 2 -q
    16
    $ python3 prog.py 4 2 -v
    4 to the power 2 equals 16
    $ python3 prog.py 4 2 -vq
    usage: prog.py [-h] [-v | -q] x y
    prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
    $ python3 prog.py 4 2 -v --quiet
    usage: prog.py [-h] [-v | -q] x y
    prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
    ################直接执行的结果####################
    $ python3 prog.py 4 2
    4^2 == 16
    $ python3 prog.py 4 2 -q
    16
    $ python3 prog.py 4 2 -v
    4 to the power 2 equals 16
    $ python3 prog.py 4 2 -vq
    usage: prog.py [-h] [-v | -q] x y
    prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
    $ python3 prog.py 4 2 -v --quiet
    usage: prog.py [-h] [-v | -q] x y
    prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
    #################看一下help信息###################
    $ python3 prog.py --help
    usage: prog.py [-h] [-v | -q] x y
    
    calculate X to the power of Y
    
    positional arguments:
      x              the base
      y              the exponent
    
    optional arguments:
      -h, --help     show this help message and exit
      -v, --verbose
      -q, --quiet
    
    ##########来自官方document的解答##########
    Note that slight difference in the usage text. Note the [-v | -q],
     which tells us that we can either use -v or -q, but not both at the same time.
    #暂且用不上这个吧.就不予讨论了
    
    • 存疑

    1.选项参数默认接受类型是int型?

    2.如果命令行中多个位置参数赋值,顺序怎么定?
    An: 按照位置参数的添加的顺序赋值。

    使用

    • NOTED

    类似Linux命令的输入形式,也就是命令 选项 参数,选项和参数可输可不输,选项是命令的行为,加了选项也就是确定了命令的行为,参数是你命令执行的对象。
    Linux命令的一般格式为 :

    $ command  [option]  [parameters]
    

    对于选项参数(option)类型有两种

    1)短选项(short option):由一个连字符和一个字母构成,例如:-a, -s等;
    
    2)长选项(long options):由两个连字符和一些大小写字母组合的单词构成,例如:--size,--help等。
    

    通常,一个程序会提供short option和long options两种形式,例如:ls -a,--all。另外,因为短选项(short option)是可以合并的,例如:-sh表示-s和-h的组合,如果要表示为一个选项sh的话就需要用长选项--sh。
    NOTED: 不是所有的Linux命令都遵循以上的规则,对于一些命令,这个单双连字符的规则似乎不起作用,例如:

    find -type d -mindepth 2
    find -name -fstype
    
    • 一些小用例

    1.两个位置一个选项:action = “count”,意思是数flag(调用选项参数)的次数。所以flag两次—“-vv”我们就执行第一个print;如果没有调用选项参数,default就是0。

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("x", type=int, help="the base")
    parser.add_argument("y", type=int, help="the exponent")
    parser.add_argument("-v", "--verbosity", action="count", default=0)
    args = parser.parse_args()
    answer = args.x**args.y
    if args.verbosity >= 2:
        print("Running '{}'".format(__file__))
    if args.verbosity >= 1:
        print("{}^{} == ".format(args.x, args.y), end="")
    print(answer)
    ######################效果########################
    $ python3 prog.py 4 2
    16
    $ python3 prog.py 4 2 -v
    4^2 == 16
    $ python3 prog.py 4 2 -vv
    Running 'prog.py'
    4^2 == 16
    

    相关文章

      网友评论

          本文标题:Argparse使用说明

          本文链接:https://www.haomeiwen.com/subject/foeheqtx.html