命令行运行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 相关文章推荐
详解Django中的权限和组以及消息
Jul 23 Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 Python
如何用python整理附件
May 13 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
python实现小世界网络生成
Nov 21 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
Tensorflow加载Vgg预训练模型操作
May 26 Python
Python机器学习之基础概述
May 19 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
Zend的MVC机制使用分析(一)
2013/05/02 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
php解析xml方法实例详解
2015/05/12 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
Symfony的安装和配置方法
2016/03/17 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
Python的Django框架使用入门指引
2015/04/15 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
Ibatis的核心配置文件都有什么
2014/09/08 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
中学运动会广播稿
2014/01/19 职场文书
工程招投标邀请书
2014/01/26 职场文书
科级干部考察材料
2014/02/15 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书