import argparse parser = argparse.ArgumentParser() parser.add_argument("--save_path", type=str, default='results/original+sem/', required=True, help="save_path") parser.add_argument("--n_epochs", type=int, default=200, required=True, 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") parser.add_argument("--b2", type=float, default=0.999, help="adam: decay of first order momentum of gradient") parser.add_argument("--n_cpu", type=int, default=8, help="number of cpu threads to use during batch generation") parser.add_argument("--latent_dim", type=int, default=100, help="dimensionality of the latent space") parser.add_argument("--img_size", type=int, default=28, help="size of each image dimension") parser.add_argument("--channels", type=int, default=1, help="number of image channels") parser.add_argument("--sample_interval", type=int, default=400, help="interval betwen image samples") parser.add_argument("--close_wandb", type=bool, default=False) parser.set_defaults(optimize=True) parser.set_defaults(kitti_crop=False) parser.set_defaults(absolute_depth=False) args = parser.parse_args() print(args) img_shape = (args.channels, args.img_size, args.img_size)
判断opt有没有哪一项,可以用
hasattr(args, 'local_rank')
以后用的时候就用opt
opt.后跟的参数就是这一些
还可以设置默认参数
parser.set_defaults(optimize=True) parser.set_defaults(kitti_crop=False) parser.set_defaults(absolute_depth=False)
required=True
表示执行这个python程序的时候必须设定这个参数项
设置参数的输入只能是某些值
parser.add_argument('--modelname', '-m', type=str, required=True, choices=['dab_detr', 'dab_deformable_detr'])
传布尔值的注意事项
可以
parser.add_argument("--R_relation", type=bool, default=False)
然后 python lian.py --R_relation True
但是不能
parser.add_argument("--R_relation", type=bool, default=True)
然后 python lian.py --R_relation False
这样得到的结果arg.R_relation还是True
所以需要这样的情况一般改写成--wo_R_relation, 然后默认传False
保存argparse配置参数
保存成json文件,这对每个实验是必要的
args = parser.parse_args() with open("new_json.json",'w',) as f: json.dump(args.__dict__, f, indent=4)
通过程序命令代替命令行传参
import argparse parser = argparse.ArgumentParser() parser.add_argument("--n_epochs", type=int, default=200, required=True, help="number of epochs of training") parser.add_argument("--batch_size", type=int, default=64, help="size of the batches") # opt = parser.parse_args() opt = parser.parse_args('--n_epochs 5 --batch_size 4'.split()) print(opt) print(opt.n_epochs) print(opt.batch_size)
action='store_true' / store_false 触发
store_true 即如果运行程序的命令中带了这个参数,action就是True,不带就是False
store_false同理
dest参数,改变传入参数名
即如果我们想在命令行传参的时候用--batchsize 来指定batchsize,而在程序中却想用args.bs来用这个值
parser.add_argument('--batchsize', dest = 'bs' )
每个命令行参数后的help什么时候起作用
当执行程序时使用 python lian.py --help就会将提示内容显示了
nargs / 传list
输入的一个参数后可能跟着多个值,例如
python lian.py -crop_size 128 128
import argparse parser = argparse.ArgumentParser(description='Process some integers...') parser.add_argument('--crop_size', help='Set the crop_size', default=[128, 128], nargs='+', type=int) opt = parser.parse_args() print(opt)
- nargs=N,一个选项后可以跟多个参数(action='append'时,依然是一个选项后跟一个参数,只不过选项可以多次出现),参数的个数必须为N的值,这些参数会生成一个列表,当nargs=1时,会生成一个长度为1的列表。
- nargs=?,如果没有在命令行中出现对应的项,则给对应的项赋值为default。特殊的是,对于可选项,如果命令行中出现了此可选项,但是之后没有跟随赋值参数,则此时给此可选项并不是赋值default的值,而是赋值const的值。
- nargs=*,和N类似,但是没有规定列表长度。
- nargs=+,和*类似,但是给对应的项当没有传入参数时,会报错error: too few arguments。
choices参数
choices参数用于限制参数的取值范围
choices
参数接受一个列表或元组,其中包含可接受的参数值。在解析参数时,如果输入的参数值不在这个列表中,则会引发错误。import argparse parser = argparse.ArgumentParser() parser.add_argument('--color', choices=['red', 'green', 'blue']) args = parser.parse_args() print(args.color)
在运行该脚本时,只有当输入的参数值为
red
、green
或blue
时,程序才会正常执行并输出参数值。如果输入的参数值不在列表中,则会输出一个错误信息--和没有--有什么区别
带-
import argparse parser = argparse.ArgumentParser() parser.add_argument('-seed', type=int, default=72, help='Random seed.') parser.add_argument('-epochs','-e', type=int, default=10000, help='Number of epochs to train.') args = parser.parse_args() print(args.seed) print(args.epochs)
都不带
import argparse parser = argparse.ArgumentParser() parser.add_argument('seed', type=int, default=72, help='Random seed.') parser.add_argument('epochs', type=int, default=10000, help='Number of epochs to train.') args = parser.parse_args() print(args.seed) print(args.epochs)
输入的值就必须按顺序来了
如果想定义argparser然后直接在程序制定,不接受命令行的传参
多用于一个程序有两套argparse的时候
args = argparse.Namespace(batch_size=128, data_path='path/to/dataset', pretrained='../GFM/gfm.pth', cfg = '../GFM/configs/BEN.yaml', )
argparse
使用步骤:
(1)import argparse 首先导入模块
(2)parser = argparse.ArgumentParser() 创建一个解析对象
(3)parser.add_argument() 向该对象中添加你要关注的命令行参数和选项
(4)parser.parse_args() 进行解析
例如,你使用的是parser.add_argument('--x')那么你用命令行输入的值就保存在args.x中
import argparse parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=72, help='Random seed.') parser.add_argument('--epochs','-e', type=int, default=10000, help='Number of epochs to train.') args = parser.parse_args() print(args.seed) print(args.epochs)
add_argument中的参数都是可选参数,就是你运行程序的时候可以不带
python hello.py
python hello.py --seed 2
python hello.py --seed 2 --epochs 10
也可用-e 10