命令行运行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爬虫模拟登录带验证码网站
Jan 22 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
Python绘制七段数码管实例代码
Dec 20 Python
python用插值法绘制平滑曲线
Feb 19 Python
详解爬虫被封的问题
Apr 23 Python
pandas 如何分割字符的实现方法
Jul 29 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
python ctypes库2_指定参数类型和返回类型详解
Nov 19 Python
Python 从attribute到property详解
Mar 05 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
flask项目集成swagger的方法
Dec 09 Python
浅谈Python数学建模之线性规划
Jun 23 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
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
2016/11/01 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
Python类的专用方法实例分析
2015/01/09 Python
Python手机号码归属地查询代码
2016/05/04 Python
python实现12306火车票查询器
2017/04/20 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
亚马逊意大利站点:Amazon.it
2020/12/31 全球购物
土木工程师岗位职责
2013/11/24 职场文书
老师给学生的表扬信
2014/01/17 职场文书
热门专业求职信
2014/05/24 职场文书
询价采购方案
2014/06/09 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang