命令行运行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的WEB框架Flask中使用多个配置文件的解决方法
Apr 18 Python
Python复制目录结构脚本代码分享
Mar 06 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
Python实现的银行系统模拟程序完整案例
Apr 12 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
python中的global关键字的使用方法
Aug 20 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
Python3 集合set入门基础
Feb 10 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
Python 3.9的到来到底是意味着什么
Oct 14 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
Apr 08 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 中文和编码判断代码
2010/05/16 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
js计算页面刷新的次数
2009/07/20 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
Python字节单位转换实例
2019/12/05 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
python中有函数重载吗
2020/05/28 Python
优秀学生干部个人的自我评价
2013/10/04 职场文书
大课间活动实施方案
2014/03/06 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
护士找工作求职信
2014/07/02 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
乱世佳人观后感
2015/06/08 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
消防安全主题班会
2015/08/12 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android