命令行运行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中使用tarfile压缩、解压tar归档文件示例
Apr 05 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
python中requests库session对象的妙用详解
Oct 30 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
Apr 28 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
QML用PathView实现轮播图
Jun 03 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
Python requests接口测试实现代码
Sep 08 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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
根德YB400的电路分析
2021/03/02 无线电
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python中return语句用法实例分析
2015/08/04 Python
Python实现身份证号码解析
2015/09/01 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
python实现SOM算法
2018/02/23 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
python实现简易学生信息管理系统
2020/04/05 Python
Python logging模块handlers用法详解
2020/08/14 Python
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
给客户的感谢信
2015/01/21 职场文书
员工辞退通知书
2015/04/17 职场文书
植物园观后感
2015/06/11 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
Python编写nmap扫描工具
2021/07/21 Python