import argparse # 导入模板
parser = argparse.ArgumentParser() # 创建parser
parser.add_argument() # 添加参数
args = parser.parse_args() # 参数解析
class argparse.ArgumentParser(
prog=None, # 设定程序名称 (defaul: sys.argv[0])
usage=None, # 替换默认的Usage信息
description=None, # 程序简要信息说明(参数说明前)
epilog=None, # 附加信息说明(参数说明后)
parents=[], # 继承父解析器(parser)
formatter_class=argparse.HelpFormatter, # 自定义帮忙信息显示格式(4种)
prefix_chars='-', # 参数前缀符号(默认为-,如:-h/--help)
fromfile_prefix_chars=None, # 从文件中引用参数(与在命令行直接写作用一致,解决参数过多的情况)
argument_default=None, # 可设置argparse.SUPPRESS阻止默认参数默认值
conflict_handler='error', # 参数冲突处理
add_help=True, # 帮助信息中默认添加"-h, --help"描述
allow_abbrev=True # 允许参数缩写
)
ArgumentParser.add_argument(
name or flags... # 选项的名称或列表,例如:foo/-f/--foo
[, action] # 采取的基本操作
store(默认) 存储参数值
store_const 使用该字符串选项时,取用const值
store_true 使用该字符串选项时,参数值置为True
store_false 使用该字符串选项时,参数值置为False
append 同一个命令行中多次使用该字符串选项时,以追加的方式将值添加到list中
append_const 将多个字符串选项的const值合并到一个list
count 统计选项出现的次数 (如:"-vvv",则最终值为3)
help parser默认会添加一个help action。(一般不用理会)
version 打印版本信息
也可以自定义action类
[, nargs] # 该参数值要求的数量
数值 指明参数个数
? 提供了参数则取参数值;
无参数但声明了选项字符串则取const值;
无参数也未声明选择字符串则取default值
* 所有参数存入list
+ 与*类似,但参数个数不能为空
argparse.REMAINDER 原封不动的记录参数到list中,通常用于将这些参数传递到其它的命令行工具。
[, const] # action/nargs部分要求的常值
1、当action="store_const"或者"append_const"时需要设置
2、当选项为(-f/--foo),nargs='?',同时未提供具体参数时,取用该值。
[, default] # 参数默认值
[, type] # 参数类型(内建参数或者函数,也可是自定义函数)
[, choices] # 允许的参数值(白名单),tuple/range
[, required] # 选项是否必须,设置为True表示选项必填。
[, help] # 参数说明,可以用其它类似 %(prog)s 格式调用prog值;可设置argparse.SUPPRESS使该选项在帮助信息中不可见。
[, metavar] # 定义参数在Usage信息中的名称
[, dest] # 解析后的属性名称
)
class argparse.Action(option_strings, dest, nargs=None, const=None,
default=None, type=None, choices=None, required=False, help=None, metavar=None)
#args=None, 程序将sys.argv作为参数代入
args = parse.parse_args()
#给args赋值,跳过sys.argv,主要用于测试工作,避免每次运行都输入冗长的参数。
args = parser.parse_args(['1', '2', '3', '4'])
# namespace=custom_class,将属性分配到一个已经存在的对象中。
parser.parse_args(args=['--foo', 'BAR'], namespace=custom_class99)
# test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--n_epochs", type=int, default=200,
help="number of epochs of training")
parser.add_argument("--batch_size", type=int, default=64,
help="size of the batches")
parser.add_argument("--lr", type=float, default=0.0002,
help="adam: learning rate")
parser.add_argument("--b1", type=float, default=0.5,
help="adam: decay of first order momentum of gradient")
opt = parser.parse_args()
print('原生opt')
print(opt)
print('通过vars()变成字典')
print(vars(opt))
from easydict import EasyDict
将字典重新转换回namespace
"""
Get attributes
>>> d = EasyDict({'foo':3})
>>> d['foo']
3
>>> d.foo
3
>>> d.bar
Traceback (most recent call last):
...
AttributeError: 'EasyDict' object has no attribute 'bar'
Works recursively
>>> d = EasyDict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> isinstance(d.bar, dict)
True
>>> d.bar.x
1
Bullet-proof
>>> EasyDict({})
{}
>>> EasyDict(d={})
{}
>>> EasyDict(None)
{}
>>> d = {'a': 1}
>>> EasyDict(**d)
{'a': 1}
>>> EasyDict((('a', 1), ('b', 2)))
{'a': 1, 'b': 2}
Set attributes
>>> d = EasyDict()
>>> d.foo = 3
>>> d.foo
3
>>> d.bar = {'prop': 'value'}
>>> d.bar.prop
'value'
>>> d
{'foo': 3, 'bar': {'prop': 'value'}}
>>> d.bar.prop = 'newer'
>>> d.bar.prop
'newer'
Values extraction
>>> d = EasyDict({'foo':0, 'bar':[{'x':1, 'y':2}, {'x':3, 'y':4}]})
>>> isinstance(d.bar, list)
True
>>> from operator import attrgetter
>>> list(map(attrgetter('x'), d.bar))
[1, 3]
>>> list(map(attrgetter('y'), d.bar))
[2, 4]
>>> d = EasyDict()
>>> list(d.keys())
[]
>>> d = EasyDict(foo=3, bar=dict(x=1, y=2))
>>> d.foo
3
>>> d.bar.x
1
Still like a dict though
>>> o = EasyDict({'clean':True})
>>> list(o.items())
[('clean', True)]
And like a class
>>> class Flower(EasyDict):
... power = 1
...
>>> f = Flower()
>>> f.power
1
>>> f = Flower({'height': 12})
>>> f.height
12
>>> f['power']
1
>>> sorted(f.keys())
['height', 'power']
update and pop items
>>> d = EasyDict(a=1, b='2')
>>> e = EasyDict(c=3.0, a=9.0)
>>> d.update(e)
>>> d.c
3.0
>>> d['c']
3.0
>>> d.get('c')
3.0
>>> d.update(a=4, b=4)
>>> d.b
4
>>> d.pop('a')
4
>>> d.a
Traceback (most recent call last):
...
AttributeError: 'EasyDict' object has no attribute 'a'
"""
站在巨人的肩膀上
from: https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation/blob/main/tools/train.py
def parse_args():
parser = argparse.ArgumentParser(description='Train a segmentor')
parser.add_argument('config', help='train config file path')
parser.add_argument('--work-dir', help='the dir to save logs and models')
parser.add_argument(
'--load-from', help='the checkpoint file to load weights from')
parser.add_argument(
'--resume-from', help='the checkpoint file to resume from')
parser.add_argument(
'--no-validate',
action='store_true',
help='whether not to evaluate the checkpoint during training')
group_gpus = parser.add_mutually_exclusive_group()
group_gpus.add_argument(
'--gpus',
type=int,
help='number of gpus to use '
'(only applicable to non-distributed training)')
group_gpus.add_argument(
'--gpu-ids',
type=int,
nargs='+',
help='ids of gpus to use '
'(only applicable to non-distributed training)')
parser.add_argument('--seed', type=int, default=None, help='random seed')
parser.add_argument(
'--deterministic',
action='store_true',
help='whether to set deterministic options for CUDNN backend.')
parser.add_argument(
'--options', nargs='+', action=DictAction, help='custom options')
parser.add_argument(
'--launcher',
choices=['none', 'pytorch', 'slurm', 'mpi'],
default='none',
help='job launcher')
parser.add_argument('--local_rank', type=int, default=0)
return args
# 怎么使用解析后的参数
def main():
args = parse_args()
cfg = Config.fromfile(args.config)
if args.options is not None:
cfg.merge_from_dict(args.options)
# set cudnn_benchmark
if cfg.get('cudnn_benchmark', False):
torch.backends.cudnn.benchmark = True
# work_dir is determined in this priority: CLI > segment in file > filename
if args.work_dir is not None:
# update configs according to CLI args if args.work_dir is not None
cfg.work_dir = args.work_dir
elif cfg.get('work_dir', None) is None:
# use config filename as default work_dir if cfg.work_dir is None
cfg.work_dir = osp.join('./work_dirs',
osp.splitext(osp.basename(args.config))[0])
if args.load_from is not None:
cfg.load_from = args.load_from
if args.resume_from is not None:
cfg.resume_from = args.resume_from
if args.gpu_ids is not None:
cfg.gpu_ids = args.gpu_ids
else:
cfg.gpu_ids = range(1) if args.gpus is None else range(args.gpus)
.....
说明:此文章仅作为学习记录用,防止自己忘了,方便重用,仅此而已。
主要参考博客:Python argparse模块详解_月夜风雨磊的博客-CSDN博客_python argparse
非常的详尽:argparse - 命令行选项与参数解析(译) (xiayf.cn)