命令行运行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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
详解Python中expandtabs()方法的使用
May 18 Python
Python数据类型学习笔记
Jan 13 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
Python生成随机数组的方法小结
Apr 15 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python3实现转换Image图片格式
Jun 21 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
Python的三个重要函数详解
Jan 18 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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
使用 MySQL Date/Time 类型
2008/03/26 PHP
PHP iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
php链表用法实例分析
2015/07/09 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
JS 分号引起的一段调试问题
2009/06/18 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
Python字符串中查找子串小技巧
2015/04/10 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
MySQL分布式恢复进阶
2022/07/23 MySQL