命令行运行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 encode和decode的妙用
Sep 02 Python
Python中的模块导入和读取键盘输入的方法
Oct 16 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
在Django中使用MQTT的方法
May 10 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的面试题集,附我的答案和分析(一)
2006/11/19 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
php实现可逆加密的方法
2015/08/11 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
Python模拟三级菜单效果
2017/09/11 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
python调用外部程序的实操步骤
2019/03/04 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
Python bisect模块原理及常见实例
2020/06/17 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
护理专业个人求职简历的自我评价
2013/10/13 职场文书
师范毕业生自荐信
2013/10/17 职场文书
企业演讲稿范文
2013/12/28 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
购房委托书范本
2014/09/18 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android