argparse教程

argparse是用来干什么的?

我觉得是想在命令行运行训练过程的同时输入训练设置也就是python3 train.py + 参数设置

得到的args的数据类型为<class 'argparse.Namespace'>

得到的args.__dict__数据类型为<class 'dict'>

位置参数和可选参数

存在着两种数据类型:位置参数和可选参数:位置参数应该是必须要传递的参数,而可选参数是可以选择传递或者不传递的参数。

测试argparse的功能
test1
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
$python3 learn_argparse.py
没有任何输出

$python learn_argparse.py --help 
$python learn_argparse.py -h
输出内容:
usage: learn_argparse.py [-h]

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

小结:只能使用python learn_argparse.py -h命令

test2
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")#用于指定程序能够接受哪些命令行选项。在这个例子中,将选项命名为 echo,与其功能一致。
args = parser.parse_args()
print(args.echo)        #将变量输出
$python3 learn_argparse.py
输出内容:
usage: learn_argparse.py [-h] echo
learn_argparse.py: error: the following arguments are required: echo

$python learn_argparse.py --help 
$python learn_argparse.py -h
输出内容:
usage: learn_argparse.py [-h] echo

positional arguments:
  echo

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

$python3 prog.py foo
foo

小结:这个python的功能挺简单的,主要是为了实现将在命令行输入的参数使用print函数输出

test3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
$ python learn_argparse.py -h
输出:
usage: learn_argparse.py [-h] echo

positional arguments:
  echo        echo the string you use here

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

小结:help选项能够为自己增加的命令,显示注释信息(也就是这个命令是用于干什么的)

test4
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)
$ python learn_argparse.py -h
usage: learn_argparse.py [-h] square

positional arguments: 
  square      display a square of a given number

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

$ python learn_argparse.py 4
16

小结:type表示指定传递给我们python代码的参数数据类型,默认为str

test5-可选参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity",type=int)
args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")
$ python learn_argparse.py -h
usage: learn_argparse.py [-h] [--verbosity VERBOSITY]

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

$ python learn_argparse.py --verbosity 1
verbosity turned on

$ python learn_argparse.py --verbosity 0
没有任何输出

$ python learn_argparse.py --verbosity                     # 这个地方必须传递参数值
usage: learn_argparse.py [-h] [--verbosity VERBOSITY]
learn_argparse.py: error: argument --verbosity: expected one argument

小结:展示可选参数的添加和使用方法

test6-action选项
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
$ python learn_argparse.py --verbose 0
usage: learn_argparse.py [-h] [--verbose]
learn_argparse.py: error: unrecognized arguments: 0

$ python learn_argparse.py --verbose 1
usage: learn_argparse.py [-h] [--verbose]
learn_argparse.py: error: unrecognized arguments: 1

$ python learn_argparse.py --verbose
verbosity turned on

$ python learn_argparse.py -h
usage: learn_argparse.py [-h] [--verbose]

optional arguments:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity

小结:使用action关键字,赋值为store_true。表示当这一选项存在时,为args.vebose赋值为True,没有指定的话则赋值为False

并且不能为--verbose指定值,否则会报错。

test7-短选项
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
$ python learn_argparse.py -v
verbosity turned on

$ python learn_argparse.py --verbose
verbosity turned on

$ python learn_argparse.py -h
usage: learn_argparse.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity

小结:短选项-v--verbose的简写,在使用上没有区别

test8-同时使用位置参数和可选参数
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)
$ python learn_argparse.py 4
16

$ python learn_argparse.py 4 -v
the square of 4 equals 16

$ python learn_argparse.py -v 4
the square of 4 equals 16

小结:注意可选参数位置参数顺序无关紧要

test9
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python learn_argparse.py -v 1 4
4^2 == 16

$ python learn_argparse.py -v 2 4
the square of 4 equals 16

$ python learn_argparse.py -v 3 4
16

当不输入-v参数时,args.verbosity的值为None

小结:运行.py文件不输入可选参数的值时,可选参数的取值为None

test10-限定参数的取值范围
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python learn_argparse.py -v 3 4
usage: learn_argparse.py [-h] [-v {0,1,2}] square
learn_argparse.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)

小结:注意这一改变同时反应在错误信息和帮助信息里。

test11-action=“count”
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python learn_argparse.py -v 3 4
usage: learn_argparse.py [-h] [-v] square
learn_argparse.py: error: unrecognized arguments: 4

$ python learn_argparse.py -v 4
4^2 == 16

$ python learn_argparse.py -vv 4
the square of 4 equals 16

$ python learn_argparse.py 4
16

$ python learn_argparse.py -vvv 4
16

小结我们引入了另一种动作 count,来数某一个可选参数出现了几次:

test12-None无法和int进行比较
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2

# bugfix: replace == with >=
if args.verbosity >= 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python learn_argparse.py -vvv 4
the square of 4 equals 16

$ python learn_argparse.py -vv 4
the square of 4 equals 16

$ python learn_argparse.py -v 4
4^2 == 16

$ python learn_argparse.py 4
Traceback (most recent call last):
  File "learn_argparse.py", line 11, in <module>
    if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'

小结:None类型数据和int类型数据无法进行比较。

test13-default参数,修改None的值为default指定的参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(args.verbosity)
$ python learn_argparse.py 4
0

test14-输出运行文件名
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)
$ python learn_argparse.py -vv 2 3
Running 'learn_argparse.py'
2^3 == 8

test15

​ 让我们再介绍第三个方法 add_mutually_exclusive_group()。 它允许我们指定彼此相互冲突的选项。 让我们再更改程序的其余部分以便使用新功能更有意义:我们将引入 --quiet 选项,它将与 --verbose 正好相反:

import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
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))
$ python learn_argparse.py -v 2 3
2 to the power 3 equals 8

$ python learn_argparse.py -q 2 3
8

$ python learn_argparse.py 2 3
2^3 == 8

$ python learn_argparse.py -h
usage: learn_argparse.py [-h] [-v | -q] x y

calculate X to the power of Y                      # 放在description里面的内容

positional arguments:
  x              the base
  y              the exponent

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet


test16
# my_test.py
# code from deepgcn_sparse
import argparse

class OptInit:
    def __init__(self):
        parser = argparse.ArgumentParser(description='PyTorch implementation of Deep GCN For semantic segmentation')

        # base
        parser.add_argument('--phase', default='test', type=str, help='train or test(default)')
        parser.add_argument('--use_cpu', action='store_true', help='use cpu?')
        parser.add_argument('--exp_name', type=str, default='sem_seg_sparse', help='prefix of saved file')
        parser.add_argument('--root_dir', type=str, default='log', help='the dir of experiment results')

        # dataset args
        parser.add_argument('--data_dir', type=str, default='/data/deepgcn/S3DIS')
        parser.add_argument('--batch_size', default=16, type=int, help='mini-batch size (default:16)')
        parser.add_argument('--in_channels', default=9, type=int, help='the channel size of input point cloud ')

        # train args
        parser.add_argument('--total_epochs', default=100, type=int, help='number of total epochs to run')
        parser.add_argument('--save_freq', default=1, type=int, help='save model per num of epochs')
        parser.add_argument('--iter', default=0, type=int, help='number of iteration to start')
        parser.add_argument('--lr_adjust_freq', default=20, type=int, help='decay lr after certain number of epoch')
        parser.add_argument('--lr', default=1e-3, type=float, help='initial learning rate')
        parser.add_argument('--lr_decay_rate', default=0.5, type=float, help='learning rate decay')
        parser.add_argument('--print_freq', default=100, type=int, help='print frequency of training (default: 100)')
        parser.add_argument('--postname', type=str, default='', help='postname of saved file')
        parser.add_argument('--multi_gpus', action='store_true', help='use multi-gpus')
        parser.add_argument('--seed', type=int, default=0, help='random seed')

        # test args
        parser.add_argument('--no_clutter', action='store_true', help='no clutter? set --no_clutter if ture.')

        # model args
        parser.add_argument('--pretrained_model', type=str, help='path to pretrained model(default: none)', default='')
        parser.add_argument('--k', default=16, type=int, help='neighbor num (default:16)')
        parser.add_argument('--block', default='res', type=str, help='graph backbone block type {plain, res, dense}')
        parser.add_argument('--conv', default='edge', type=str, help='graph conv layer {edge, mr}')
        parser.add_argument('--act', default='relu', type=str, help='activation layer {relu, prelu, leakyrelu}')
        parser.add_argument('--norm', default='batch', type=str, help='{batch, instance} normalization')
        parser.add_argument('--bias', default=True,  type=bool, help='bias of conv layer True or False')
        parser.add_argument('--n_filters', default=64, type=int, help='number of channels of deep features')
        parser.add_argument('--n_blocks', default=28, type=int, help='number of basic blocks')
        parser.add_argument('--dropout', default=0.3, type=float, help='ratio of dropout')
        args = parser.parse_args()
        self._print_args()
        
        def _print_args(self):
            logging.info("==========       args      =============")
            for arg, content in self.args.__dict__.items():
                logging.info("{}:{}".format(arg, content))
            logging.info("==========     args END    =============")
            logging.info("\n")

注意:当这样设置代码时,输入python my_test.py --help,没有任何反应,需要在文件中加入才行

if __name__ == '__main__':
    optinit = OptInit()        

在这里插入图片描述

这样我们有会有一个疑问,那么我在其他的python文件中定义这个类是否也会有类似输入python my_test_others.py --help,然后输出帮助信息那?开整

# my_test_others.py
from my_test import OptInit

optinit = OptInit() 

在这里插入图片描述
哈哈哈,输出果然是这样,也就是说类中的定义argparse是属于类的

在训练时的使用方法
parser = argparse.ArgumentParser()
parser.add_argument('--no-cuda', action='store_true', default=False,
                    help='Disables CUDA training.')
parser.add_argument('--fastmode', action='store_true', default=False,
                    help='Validate during training pass.')
parser.add_argument('--seed', type=int, default=42, help='Random seed.')
parser.add_argument('--epochs', type=int, default=200,
                    help='Number of epochs to train.')
parser.add_argument('--lr', type=float, default=0.01,
                    help='Initial learning rate.')
parser.add_argument('--weight_decay', type=float, default=5e-4,
                    help='Weight decay (L2 loss on parameters).')
parser.add_argument('--hidden', type=int, default=16,
                    help='Number of hidden units.')
parser.add_argument('--dropout', type=float, default=0.5,
                    help='Dropout rate (1 - keep probability).')

args = parser.parse_args()

args.cuda = not args.no_cuda and torch.cuda.is_available()    # 还可以定义变量
参考教程资料

Argparse 教程

pygcn/train.py

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值