命令行运行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模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
Django CBV类的用法详解
Jul 26 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
python numpy 矩阵堆叠实例
Jan 17 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
Python命名空间及作用域原理实例解析
Aug 12 Python
谈谈python垃圾回收机制
Sep 27 Python
python元组打包和解包过程详解
Aug 02 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
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
Python Tkinter简单布局实例教程
2014/09/03 Python
Python模拟登陆实现代码
2017/06/14 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python元字符的用法实例解析
2018/01/17 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
电工工作职责范本
2014/02/22 职场文书
副总经理任命书
2014/06/05 职场文书
银行进社区活动总结
2014/07/07 职场文书
综治工作心得体会
2014/09/11 职场文书
社会工作专业自荐信
2014/09/26 职场文书
见习报告怎么写
2014/10/31 职场文书
2014年幼师工作总结
2014/11/22 职场文书
建议书范文
2015/02/05 职场文书
导游词之无锡古运河
2019/11/14 职场文书