在之前的代码中,我一般都是用sys包来接受系统输入,然后自己写对应的函数判断,发现其实有argparse可以很方便的完成构造参数输入的工作:
"""
Filename: args.py
用于设置参数以及默认值
"""
import argparse
def get_args():
"""
设置运行参数
"""
parser = argparse.ArgumentParser(description='MalConv')
parser.add_argument('--train_dir', default='./datas/train',
help='dir of train samples')
parser.add_argument('--test_dir', default='./datas/test',
help='dir of test samples')
parser.add_argument('--label_dict', default="./datas/label_dict.json", help='path to label dict')
parser.add_argument('--batch_size', type=int, default=8, help='input batch size')
parser.add_argument('--model', default=None, help='path of model loaded')
parser.add_argument('--epoch', type=int, default=1, help='training epoch num')
parser.add_argument('--lr', type=float, default=0.0001, help='learning rate, default=0.0001')
parser.add_argument('--ckpt_dir', default="./checkpoint", help='path to pretrained ckpt model file')
parser.add_argument('--output_file', default="result.txt", help='output result path')
parser.add_argument('--seed', type=int, default=1, help='random seed')
parser.add_argument('--device_target', default='CPU', help='device target')
parser.add_argument('--mode', default="graph", help="'graph' or 'pynative'")
parser.add_argument('--device_num', type=int, default=1)
parser.add_argument('--device_id', type=int, default=0)
parser.add_argument('--rank_id', type=int, default=0)
args_opt = parser.parse_args()
return args_opt
注意小数,布尔,整数类型的要加上type来限制类型,不然会被识别为字符串
使用的时候也很方便,直接使用对应的变量名即可调用
from args import get_args
args_opt=get_args()
seed=args_opt.seed
如果希望不用–来指定参数名,而是希望直接通过输入参数的顺序直接映射属性,比如
python args.py --seed 4 --rank_id 5 变成 python args.py 4 5 这样的,需要用到dest这个属性,同时省掉开始的–选项:
parser.add_argument(default=4,
help='seed,dest=‘seed’)
parser.add_argument(default=5,
help=‘rank_id’,dest=‘rank_id’)
实际测试中遇到两个报错:
unrecognized arguments和missing arguments
前置是因为使用位置来定义映射参数的时候,遇到了多个参数,超出了原来定义的个数,后者是因为输入的参数少了,没有达到定义的个数,解决方法,通过
args_opt, _ = parser.parse_known_args()用一个空变量接受多余的参数,然后加上 nargs='?'来让参数变为可选项,同时赋予默认值,这样少参数多参数都不会报错。
表示设置参数个数
nargs=‘*’: 表示参数可设置零个或多个
nargs=‘+’:表示参数可设置一个或多个
nargs=‘?’: 表示参数可设置零个或一个
修改后如下:
import argparse
def get_args():
"""
设置运行参数
"""
parser = argparse.ArgumentParser(description='PcapFisher')
parser.add_argument(default='',
help='1st argument:pcap file path', dest='pcap_file',nargs='?')
parser.add_argument(default='',
help='2nd argument:tls key path', dest='master_key_path', nargs='?')
parser.add_argument(default='',
help='3rd argument:output file path', dest='output_file_path', nargs='?')
parser.add_argument(default='',
help='4th argument:output dir of cert', dest='cert_dir', nargs='?')
parser.add_argument(default='',
help='5th argument:output path of cert infor', dest='cert_info_path', nargs='?')
parser.add_argument(default='',
help='6th argument:output path of pcap file with tls key', dest='with_key_pcap_path', nargs='?')
parser.add_argument(default='',
help="7th argument:output path of pcap's statistical infor", dest='count_file_path', nargs='?')
args_opt, _ = parser.parse_known_args()
return args_opt