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进阶教程之词典、字典、dict
Aug 29 Python
Python中的super()方法使用简介
Aug 14 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
python3的print()函数的用法图文讲解
Jul 16 Python
Django Rest framework认证组件详细用法
Jul 25 Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 Python
python datetime中strptime用法详解
Aug 29 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
python turtle 绘制太极图的实例
Dec 18 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
python爬取抖音视频的实例分析
Jan 19 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 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中数组首字符过滤功能代码
2012/07/31 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
JavaScript 事件对象的实现
2009/07/13 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
jQuery链使用指南
2015/01/20 Javascript
javascript实用方法总结
2015/02/06 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
焦裕禄精神心得体会
2014/09/02 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫