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中实现定制类的特殊方法总结
Sep 28 Python
Python中subprocess模块用法实例详解
May 20 Python
qpython3 读取安卓lastpass Cookies
Jun 19 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
python 上下文管理器使用方法小结
Oct 10 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
python安装numpy和pandas的方法步骤
May 27 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
python实现把二维列表变为一维列表的方法分析
Oct 08 Python
python二元表达式用法
Dec 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执行速度全攻略
2006/10/09 PHP
php checkbox 取值详细说明
2010/08/19 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
python网络编程实例简析
2014/09/26 Python
Python实现ping指定IP的示例
2018/06/04 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
python判断变量是否为列表的方法
2020/09/17 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
HTML5手机端弹出遮罩菜单特效代码
2016/01/27 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
个人能力自我鉴赏
2014/01/25 职场文书
网上卖盒饭创业计划书
2014/01/26 职场文书
大学考试作弊检讨书
2014/01/30 职场文书
运动会加油口号
2014/06/07 职场文书
文明班级申报材料
2014/12/24 职场文书
离婚民事起诉状
2015/08/03 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS
python开发的自动化运维工具ansible详解
2021/08/07 Python
python 单机五子棋对战游戏
2022/04/28 Python
Spring中bean集合注入的方法详解
2022/07/07 Java/Android