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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
python取余运算符知识点详解
Jun 27 Python
python pandas生成时间列表
Jun 29 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
pytorch 常用线性函数详解
Jan 15 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 Python
Python如何重新加载模块
Jul 29 Python
Python中的tkinter库简单案例详解
Jan 22 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
如何在PHP中生成随机数
2020/06/04 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
javascript 写类方式之六
2009/07/05 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JavaScript中的时间处理小结
2016/02/24 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
python和bash统计CPU利用率的方法
2015/07/10 Python
TensorFlow Session会话控制&Variable变量详解
2018/07/30 Python
python 二维数组90度旋转的方法
2019/01/28 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
成品仓管员工作职责
2013/12/29 职场文书
入党申请自荐书范文
2014/02/11 职场文书
承诺书范本
2015/01/21 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
如何写好闭幕词
2019/04/02 职场文书
vue修饰符.capture和.self的区别
2022/04/22 Vue.js
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers