命令行运行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 中文字符串的处理实现代码
Oct 25 Python
Python中subprocess模块用法实例详解
May 20 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
pytorch打印网络结构的实例
Aug 19 Python
python返回数组的索引实例
Nov 28 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
python实现在一个画布上画多个子图
Jan 19 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
Python爬虫抓取论坛关键字过程解析
Oct 19 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上传文件时文件过大$_FILES为空的解决方法
2013/11/26 PHP
开启PHP的伪静态模式
2015/12/31 PHP
php session的应用详细介绍
2017/03/22 PHP
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
python3下载抖音视频的完整代码
2019/06/05 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
django表单的Widgets使用详解
2019/07/22 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
生日寿宴答谢词
2014/01/19 职场文书
开发房地产协议书
2014/09/14 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
2015年读书月活动总结
2015/03/26 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
法定代表人资格证明书
2015/06/18 职场文书
中学教师读书笔记
2015/07/01 职场文书
小学安全教育主题班会
2015/08/12 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
用Python实现Newton插值法
2021/04/17 Python
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
四十九个javascript小知识实用技巧
2021/11/20 Javascript
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android