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实现根据主机名字获得所有ip地址的方法
Jun 28 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
详解python中executemany和序列的使用方法
Aug 12 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
如何使用VSCode愉快的写Python于调试配置步骤
Apr 06 Python
Python求正态分布曲线下面积实例
Nov 20 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
Python自动化操作实现图例绘制
Jul 09 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
PyQt实现计数器的方法示例
Jan 18 Python
Python学习之包与模块详解
Mar 19 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工厂模式
2014/11/25 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
JavaScript中的"=、==、==="区别讲解
2019/01/22 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
python logging通过json文件配置的步骤
2020/04/27 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
Python内置函数及功能简介汇总
2020/10/13 Python
python re的findall和finditer的区别详解
2020/11/15 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
采购经理岗位职责
2014/02/16 职场文书
年度考核自我鉴定
2014/03/19 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
《包身工》教学反思
2016/02/23 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL