命令行运行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静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
详解Python安装scrapy的正确姿势
Jun 26 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
Feb 26 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
深入了解Python装饰器的高级用法
Aug 13 Python
Django 用户认证Auth组件的使用
Nov 30 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
Jun 05 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 字符串压缩方法比较示例
2014/01/23 PHP
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
JS document对象简单用法完整示例
2020/01/14 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
python实现web方式logview的方法
2015/08/10 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
新学期国旗下演讲稿
2014/05/08 职场文书
课例研修方案
2014/05/31 职场文书
人大调研汇报材料
2014/08/14 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
python中24小时制转换为12小时制的方法
2021/06/18 Python
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
图文详解nginx日志切割的实现
2022/01/18 Servers
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL