命令行运行Python脚本时传入参数的三种方式详解


Posted in Python onOctober 11, 2019

如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式。

python script.py 0,1,2 10
python script.py -gpus=0,1,2 --batch-size=10
python script.py -gpus=0,1,2 --batch_size=10

这三种格式对应不同的参数解析方式,分别为sys.argv, argparse, tf.app.run, 前两者是python自带的功能,最后一个是tensorflow提供的便捷方式(只是在命令行执行时看上去跟第二个相同,源码部分的区别见下)。

sys.argv

sys模块是很常用的模块, 它封装了与python解释器相关的数据,例如sys.modules里面有已经加载了的所有模块信息,

sys.path里面是PYTHONPATH的内容,而sys.argv则封装了传入的参数数据。

使用sys.argv接收上面第一个命令中包含的参数方式如下:

import sys
gpus = sys.argv[1]
#gpus = [int(gpus.split(','))]
batch_size = sys.argv[2]
print(gpus, type(gpus))
print(batch_size, type(batch_size))

执行结果:

D:\projects\Pycharm Projects\some-toys\something_else>python argv_test.py 1,0,2 10
1,0,2 <class 'str'>
10 <class 'str'>

argparse

import argparse
parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument('--gpus', type=str, default = None)
parser.add_argument('--batch-size', type=int, default=32)
args = parser.parse_args()
print(args.gpus, type(args.gpus))
print(args.batch_size, type(args.batch_size))

执行结果:

D:\projects\Pycharm Projects\some-toys\something_else>python argv_test.py --gpus=0,1,2 --batch-size=20
0,1,2 <class 'str'>
20 <class 'int'>

需要注意的是,脚本运行命令python script.py --gpus=0,1,2 --batch-size=10中的batch-size会被自动解析成batch_size.
parser.add_argument 方法的type参数理论上可以是任何合法的类型, 但有些参数传入格式比较麻烦,例如list,所以一般使用bool, int, str, float这些基本类型就行了,更复杂的需求可以通过str传入,然后手动解析。bool类型的解析比较特殊,传入任何值都会被解析成True,传入空值时才为False

python script.py --bool-val=0 # args.bool_val=True
python script.py --bool-val=False # args.bool_val=True
python script.py --bool-val=   # args.bool_val=什么都不写False

通过这个方法还能指定命令的帮助信息。具体请看API文档:https://docs.python.org/2/library/argparse.html

tf.app.run

tensorflow也提供了一种方便的解析方式。

脚本的执行命令为:

python script.py -gpus=0,1,2 --batch_size=10

对应的python代码为:

import tensorflow as tf
tf.app.flags.DEFINE_string('gpus', None, 'gpus to use')
tf.app.flags.DEFINE_integer('batch_size', 5, 'batch size')

FLAGS = tf.app.flags.FLAGS

def main(_):
  print FLAGS.gpus
  print FLAGS.batch_size

if __name__=="__main__":
  tf.app.run()

有几点需要注意:

tensorflow只提供以下几种方法:

  • tf.app.flags.DEFINE_string,
  • tf.app.flags.DEFINE_integer,
  • tf.app.flags.DEFINE_boolean,
  • tf.app.flags.DEFINE_float

四种方法,分别对应str, int,bool,float类型的参数。这里对bool的解析比较严格,传入1会被解析成True,其余任何值都会被解析成False。

脚本中需要定义一个接收一个参数的main方法:def main(_):,这个传入的参数是脚本名,一般用不到, 所以用下划线接收。
以batch_size参数为例,传入这个参数时使用的名称为--batch_size,也就是说,中划线不会像在argparse 中一样被解析成下划线。

tf.app.run()会寻找并执行入口脚本的main方法。也只有在执行了tf.app.run()之后才能从FLAGS中取出参数。

从它的签名来看,它也是可以自己指定需要执行的方法的,不一定非得叫main:

run(
  main=None,
  argv=None
)

tf.app.flags只是对argpars的简单封装。代码见

https://github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/python/platform/flags.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python正则分组的应用
Nov 10 Python
python监控网站运行异常并发送邮件的方法
Mar 13 Python
python类装饰器用法实例
Jun 04 Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 Python
python 队列详解及实例代码
Oct 18 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
django中静态文件配置static的方法
May 20 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
Python 使用多属性来进行排序
Sep 01 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
Python socket服务常用操作代码实例
Jun 22 Python
python中对_init_的理解及实例解析
Oct 11 #Python
pandas数据处理进阶详解
Oct 11 #Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 #Python
树莓派安装OpenCV3完整过程的实现
Oct 10 #Python
树莓派极简安装OpenCv的方法步骤
Oct 10 #Python
python 利用jinja2模板生成html代码实例
Oct 10 #Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 #Python
You might like
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
Python之py2exe打包工具详解
2017/06/14 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
Django csrf 验证问题的实现
2018/10/09 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
python能做哪方面的工作
2020/06/15 Python
基于PyTorch中view的用法说明
2021/03/03 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
宿舍保安职务说明书
2014/02/25 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
社区母亲节活动总结
2015/02/10 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
母亲节主题班会
2015/08/14 职场文书
python的html标准库
2022/04/29 Python