python输入处理系列文章,专栏总目录:
1、使用步骤
1)import argparse,导入模块;
2)parser = argparse.ArgumentParser(),创建一个解析对象;
3)parser.add_argument(),向该对象中添加你要关注的命令行参数和选项;
4)parser.parse_args(),进行解析。
使用实例:
import argparse
def argv_parse():
parser = argparse.ArgumentParser(usage="it's usage tip.", description="test demo.")
parser.add_argument("--func", "-f", choices=["init", "predict"], required=True, help="func you called.")
return parser.parse_args()
def main():
argv = argv_parse()
print("argv:", argv)
if __name__ == '__main__':
main()
# 执行
# or python demo.py -f init
python demo.py --func init
# 查看帮助
python demo.py --help
2、相关参数
2.1、必需参数
required、type,这种模式用于确保某些必需的参数有输入。
例:parser.add_argument('--verbose', required=True, type=int),required标签就是说--verbose参数是必需的,并且类型为int,输入别的类型会报错。
2.2、位置参数(positional arguments)
位置参数与sys.argv调用比较像,参数没有显式的--xxx或者-xxx标签,因此调用属性也与sys.argv相同。
parser.add_argument('filename') # 输入的第一个参数赋予名为filename的键
args = parser.parse_args()
此外,可以用nargs参数来限定输入的位置参数的个数,默认为1。当然nargs参数也可用于普通带标签的参数。
parser.add_argument('num', nargs=2, type=int)表示脚本可以读入两个整数赋予num键(此时的值为2个整数的数组)。nargs还可以'*'用来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值;‘+’表示读取至少1个该位置参数。'?'表示该位置参数要么没有,要么就只要一个。(PS:跟正则表达式的符号用途一致。)比如用:
parser.add_argument('filename')
parser.add_argument('num', nargs='*)
就可以运行python test.py text.txt 1 2
由于没有标签,所以用位置参数的时候需要比较小心。
2.3、输入文件类型
之前已经提到了用type参数就可以指定输入的参数类型。而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作。
parser.add_argument('file', type=argparser.FileType('r')) # 读取文件
args = parser.parse_args()
for line in args.file:
print line.strip()
2.4、参数默认值
default,一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现。
parser.add_argument('filename', default='text.txt')
这个时候至直接运行python text.py就能得到Read in text.txt而不需要输入文件名了。
2.5、候选参数选择
choices,表示该参数能接受的值只能来自某几个值候选值中,除此以外会报错,用choices参数即可。比如:
parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])
注:点到包的ArgumentParser函数中查看更多参数和用法。
2.6、指定变量名
dist,指定变量名。
parser.add_argument('filename', dist="file_name")
则,为输入参数filename重命名为file_name。
3、参数说明
add_argument() 方法定义如何解析命令行参数:
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
每个参数解释如下:
name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
action - 命令行遇到参数时的动作,默认值是 store。
store_const,表示赋值为const;
append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
append_const,将参数规范中定义的一个值保存到一个列表;
count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
const - action 和 nargs 所需要的常量值。
default - 不指定参数时的默认值。
type - 命令行参数应该被转换成的类型。
choices - 参数可允许的值的一个容器。
required - 可选参数是否可以省略 (仅针对可选参数)。
help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.
4、例子
4.1、action='store_true'
store_true 是指带触发action时为真,不触发则为假,代码去掉default初始化,其功能也不会变化
parser.add_argument('-c', action='store_true', default=false)
# python test.py -c => c是true(因为action)
# python test.py => c是false(default)
4.2、nargs= '+'
正则表达式的规则-参数个数:
nargs='*' 表示参数可设置零个或多个
nargs= '+' 表示参数可设置一个或多个
nargs='?' 表示参数可设置零个或一个
示例测试:
parser.add_argument(
'--gpu-ids',
type=int,
nargs='+',
help='ids of gpus to use '
'(only applicable to non-distributed training)')
测试方式:
python 脚本 --gpu-ids 1 2 3
=>
args: Namespace(gpu_ids=[1, 2, 3], ...)
4.3、实例测试
import argparse
def default_argument_parser():
parser = argparse.ArgumentParser(description="Detectron2 Training")
parser.add_argument("--config-file",
default="configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml",
metavar="FILE", help="path to config file")
parser.add_argument(
"--resume",
action="store_true",
help="whether to attempt to resume from the checkpoint directory",
) # 未调用则为false,调用为true
parser.add_argument("--eval-only", action="store_true", help="perform evaluation only")
parser.add_argument("--num-gpus", type=int, default=1, help="number of gpus *per machine*")
parser.add_argument("--num-machines", type=int, default=1)
parser.add_argument("--machine-rank", type=int, default=0, help="the rank of this machine (unique per machine)")
port = 2 ** 15 + 2 ** 14 + hash(os.getuid()) % 2 ** 14
parser.add_argument("--dist-url", default="tcp://127.0.0.1:{}".format(port))
parser.add_argument(
"opts",
help="Modify config options using the command-line",
default=None,
nargs=argparse.REMAINDER,
)
return parser
调用过程:
python tools/train_net.py --config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml SOLVER.IMS_PER_BATCH 2 SOLVER.
BASE_LR 0.0025 # Detectron2代码
结果:
Namespace(config_file='configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml', dist_url='tcp://127.0.0.1:59725', eval_only=False,
machine_rank=0, num_gpus=1, num_machines=1, opts=['SOLVER.IMS_PER_BATCH', '2', 'SOLVER.BASE_LR', '0.0025'], resume=False)
参考资料:
1、官网文档
https://docs.python.org/3.6/library/argparse.html
2、python argparse模块
https://www.cnblogs.com/arkenstone/p/6250782.html
3、python argparse参数
https://blog.csdn.net/weixin_31866177/article/details/82111586