Python ArgumentParse的subparser用法说明


Posted in Python onApril 20, 2020

在写一些很小的机器学习项目的时候,我们往往希望training, testing和inference能共用一个入口main,但是不同的功能使用不同的input参数.当然如果三个功能对应三个.py脚本问题也不大,但是毕竟觉得不太优雅.这个时候就需要考虑如何让代码更加简单有条理.

主要是最近在看parser有关的东西,所以看到了一个项目,里面的使用subparser的地方是值得借鉴的,下面附上代码和部分自己的一些见解

def main():
 parser = argparse.ArgumentParser()
 subparsers = parser.add_subparsers()

 hparams = make_hparams() 
 # 这个函数是直接写了一些超参数,讲真我不太喜欢这个操作,个人还是比较倾向用一个额外的config文件来存储
 # 这些超参,这样输入的只要是config文件的路径即可;主要是这么做可以看到自己每一步的参数是怎么设置的
 # 便于后期出现了问题来排错
 subparser = subparsers.add_parser("train")
 # add subparser here
 subparser.set_defaults(callback=lambda args: run_train(args, hparams))
 # 加上callback选项,run_train是前期定义的一个函数,这条和后面的args.callback(args)对应
 hparams.populate_arguments(subparser) 
 # 这里就是作者自己定义的一个函数,本质其实还是一系列的add_argument
 subparser.add_argument("--numpy-seed", type=int)
 subparser.add_argument("--model-path-base", required=True)
 subparser.add_argument("--evalb-dir", default="EVALB/")
 subparser.add_argument("--train-path", default="data/02-21.10way.clean")
 subparser.add_argument("--dev-path", default="data/22.auto.clean")
 subparser.add_argument("--batch-size", type=int, default=250)
 subparser.add_argument("--subbatch-max-tokens", type=int, default=2000)
 subparser.add_argument("--eval-batch-size", type=int, default=100)
 subparser.add_argument("--epochs", type=int)
 subparser.add_argument("--checks-per-epoch", type=int, default=4)
 subparser.add_argument("--print-vocabs", action="store_true")

 subparser = subparsers.add_parser("test")
 subparser.set_defaults(callback=run_test)
 subparser.add_argument("--model-path-base", required=True)
 subparser.add_argument("--evalb-dir", default="EVALB/")
 subparser.add_argument("--test-path", default="data/23.auto.clean")
 subparser.add_argument("--test-path-raw", type=str)
 subparser.add_argument("--eval-batch-size", type=int, default=100)

 subparser = subparsers.add_parser("ensemble")
 subparser.set_defaults(callback=run_ensemble)
 subparser.add_argument("--model-path-base", nargs='+', required=True)
 subparser.add_argument("--evalb-dir", default="EVALB/")
 subparser.add_argument("--test-path", default="data/22.auto.clean")
 subparser.add_argument("--eval-batch-size", type=int, default=100)

 subparser = subparsers.add_parser("parse")
 subparser.set_defaults(callback=run_parse)
 subparser.add_argument("--model-path-base", required=True)
 subparser.add_argument("--input-path", type=str, required=True)
 subparser.add_argument("--output-path", type=str, default="-")
 subparser.add_argument("--eval-batch-size", type=int, default=100)

 subparser = subparsers.add_parser("viz")
 subparser.set_defaults(callback=run_viz)
 subparser.add_argument("--model-path-base", required=True)
 subparser.add_argument("--evalb-dir", default="EVALB/")
 subparser.add_argument("--viz-path", default="data/22.auto.clean")
 subparser.add_argument("--eval-batch-size", type=int, default=100)

 args = parser.parse_args()
 args.callback(args)

补充知识:python 学习笔记--argparse模块以及parse_known_args()函数

代码test.py:

import argparse
import sys

parse=argparse.ArgumentParser()
parse.add_argument("--learning_rate",type=float,default=0.01,help="initial learining rate")
parse.add_argument("--max_steps",type=int,default=2000,help="max")
parse.add_argument("--hidden1",type=int,default=100,help="hidden1")
flags,unparsed=parse.parse_known_args(sys.argv[1:])
print flags.learning_rate
print flags.max_steps
print flags.hidden1
print unparsed

运行

python test.py --learning_rate 20 --max_steps 10 --hidden1 100 --arg_int 2

其效果等同于

python test.py --learning_rate=20 --max_steps=10 --hidden1=100 --arg_int=2

输出:

20.0
10
100

['--arg_int', '2']

flags为namespace空间,结果是Namespace(hidden1=100, learning_rate=20.0, max_steps=10),包含程序定义了的命令行参数,而unparsed为程序没有定义的命令行参数。

以上这篇Python ArgumentParse的subparser用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python自动扫雷实现方法
Jul 25 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
python实现决策树分类
Aug 30 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
详解Django admin高级用法
Nov 06 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
python函数定义和调用过程详解
Feb 09 Python
Python unittest框架操作实例解析
Apr 13 Python
python绘图模块之利用turtle画图
Feb 12 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
python列表的逆序遍历实现
Apr 20 #Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 #Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 #Python
python 错误处理 assert详解
Apr 20 #Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 #Python
在ipython notebook中使用argparse方式
Apr 20 #Python
Python绘制全球疫情变化地图的实例代码
Apr 20 #Python
You might like
一个PHP的String类代码
2010/04/20 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
发现的以前不知道的函数
2006/09/19 Javascript
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
js里的prototype使用示例
2010/11/19 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
js中的闭包学习心得
2018/02/06 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
英语专业职业生涯规划范文
2014/03/05 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL