命令行运行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使用paramiko模块实现ssh远程登陆上传文件并执行
Jan 27 Python
简单介绍Python中的round()方法
May 15 Python
python比较两个列表是否相等的方法
Jul 28 Python
Python 中Pickle库的使用详解
Feb 24 Python
使用Python实现在Windows下安装Django
Oct 17 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
python创建n行m列数组示例
Dec 02 Python
执行Python程序时模块报错问题
Mar 26 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 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 爬取网页的主要方法
2018/07/13 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
python实现NB-IoT模块远程控制
2018/06/20 Python
python判断设备是否联网的方法
2018/06/29 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
建筑专业自荐信
2013/10/18 职场文书
数控专业应届生求职信
2013/11/27 职场文书
初中物理教学反思
2014/01/14 职场文书
高中生自我评语大全
2014/01/19 职场文书
八年级生物教学反思
2014/01/22 职场文书
美发店5.1活动方案
2014/01/24 职场文书
小区停车场管理制度
2014/01/27 职场文书
食品流通安全承诺书
2014/05/22 职场文书
董事长秘书工作职责
2014/06/10 职场文书
公务员个人考察材料
2014/12/23 职场文书
检讨书怎么写
2015/05/07 职场文书
领导干部学习心得体会
2016/01/23 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python