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使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
python中模块的__all__属性详解
Oct 26 Python
Python实现的购物车功能示例
Feb 11 Python
Python反射的用法实例分析
Feb 11 Python
python 读取DICOM头文件的实例
May 07 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
python pycharm最新版本激活码(永久有效)附python安装教程
Sep 18 Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 Python
Python函数式编程中itertools模块详解
Sep 15 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 Python
如何用六步教会你使用python爬虫爬取数据
Apr 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适配器模式介绍
2012/08/14 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
Python 的类、继承和多态详解
2017/07/16 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
Django的models中on_delete参数详解
2019/07/16 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
自荐书模板
2013/12/19 职场文书
满月酒答谢词
2014/01/14 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
2014年建筑工作总结
2014/11/26 职场文书
罚站检讨书
2015/01/29 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
市场部岗位职责范本
2015/04/15 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js