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对象的深拷贝和浅拷贝详解
Aug 25 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
Python实现计算最小编辑距离
Mar 17 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
手把手教你python实现SVM算法
Dec 27 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
python有几个版本
Jun 17 Python
Python如何发送与接收大型数组
Aug 07 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 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
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
python版简单工厂模式
2017/10/16 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
用python解压分析jar包实例
2020/01/16 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
大一自我鉴定范文
2013/12/27 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
婚宴新郎致辞
2015/07/28 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
css3 filter属性的使用简介
2021/03/31 HTML / CSS
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python
MySQL池化框架学习接池自定义
2022/07/23 MySQL