Python脚本传参的三种方式(sys.argv、argparse、tf.app.flags)

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。Python脚本传参的三种方式(sys.argv、argparse、tf.app.flags),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在实际工作中,如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式。

在这里插入图片描述

这三种格式对应不同的参数解析方式,分别为

  • sys.argv
  • argparse
  • tf.app.flags

前两者是python自带的功能,后者是tensorflow提供的便捷方式。

1. python的sys.argv

sys模块是很常用的模块, 它封装了与python解释器相关的数据,例如sys.modules里面有已经加载了的所有模块信息,sys.path里面是PYTHONPATH的内容,而sys.argv则封装了传入的参数数据。

使用sys.argv接收上面第一个命令中包含的参数方式如下:
在这里插入图片描述

在这里插入图片描述

2. python的argparse包

argparse是python的命令行解析工具,可以在python代码中调用shell的一些命令。程序内部定义了需要使用的参数,argparse 会默认自动从 sys.argv中解析出对应的参数。argparse模块会自动生成帮助信息和使用提示,同时当用户使用无效参数时,会显示错误原因。

tensorflow的一些例子中用argparse来定义一些默认命令,通常是全局变量,也是用作和系统命令之间交互的全局设置。

【argparse官网】https://docs.python.org/3.6/library/argparse.html

2.1 argparse的基本用法

下面一个实例展示了argparse的基本使用方法:

import argparse 

# 创建一个参数解析实例
parser = argparse.ArgumentParser(description='Parameters') 

# 添加参数解析
parser.add_argument('--training_epoch', type=int, default=3000)
parser.add_argument('--learning_rate', type=float, default=0.001)
parser.add_argument('--model_name', type=str, default='lstm')

# 开始解析
# pycharm: args = parser.parse_args()
# jupyter: args = parser.parse_args(args=[])
args = parser.parse_args(args=[]) 

# 输出参数
print({args})
print(args.training_epoch)
print(args.learning_rate)
print(args.model_name)
# 参数的使用
epochs = args.training_epoch
lr = args.learning_rate
model = args.model_name

2.2 ArgumentParser.add_argument()传参

add_argument()方法的基本定义如下:

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) 

相关参数的含义如下:

  • name or flags:位置参数或者可选参数名称,如foo 或者 -foo,–foo
  • action: 命令行遇到参数时的动作,默认值是 store。
  • nargs:命令行参数的数量。
    命令行传入的参数默认都是1,这个参数可以指定传入的参数个数。nargs有以下几种方式:
    (1)nargs=N(N 是一个大于等于1的整数)
    (2)nargs=‘?’(允许不指定参数,利用const中的常量给予值)
  • const:在action或者nargs选项中设置的常量。
    const与action和nargs配合使用。与action配合,参考 action=‘store_const’。与nargs配合参考nargs=‘?’。
  • default:在没有参数输入时,默认输入值。
  • type:命令行参数的类型。
  • choices:允许的参数集合。
  • required:是否可以省略命令行选项(仅限可选类型)(默认值为True)。
  • help:帮助简单的描述。
  • metavar:参数使用信息名称(A name for the argument in usage messages)。
  • dest:命令的别称。

【参考博客】:Python-argparse库基本使用方法和add_argument() 参数详解:https://blog.csdn.net/foneone/article/details/103984895

2.3 add_argument()传参为list类型

argparse的parser.add_argument()函数中传入参数的type为常见的类型,如int,str,float等。

  • 如果想要传入list等复杂类型,要如何操作呢?以输入 int 类型的 list [1, 2, 3] 为例:
# nargs=3 限制该参数只能有3个输入
# required=True 该参数为必须输入项;required=False 该参数为可选输入项
parser.add_argument('--test_data', type=int, nargs=3, required=True) 

test_data = args.test_data
print('test_data:', test_data)  

在控制台下运行如下命令:

python main.py --test_data 1 2 3

可以看到 test_data 的输出结果为

# test_data: [1, 2, 3]

假设我们想给 test_data 输入多个参数,则可以使用 “nargs=‘+’”,如下所示:

# nargs='+' 该参数可以有多个输入
parser.add_argument('--test_data', type=int, nargs='+', required=True)
  • 如果需要的输入是array,这时可以自己再将 list 转化为自己所需的 array 以及相应的shape,如:
test_array = np.array(test_data)   # 将传入的list转为array类型
test_array_new = test_array.reshape(-1, 3, 1)
print('test_array_new:', test_array_new)  
# test_data: [[[1] [2] [3]]]

到这里,就得到了我们所需要的shape为(-1, 3, 1)的array,再将array作为入参传入我们Python的函数中即可。

【补充】:更多 list 类型参数的传入,可以参考博客:

3. tf.app.flags组件

在Tensorflow中,还可以使用flags定义命令行参数。

3.1 tf.app.flags的基本用法

tf定义了tf.app.flags,用于接受命令行传递参数,相当于接受argv。首先调用自带的DEFINE_integer,DEFINE_float, DEFINE_string 等设置不同类型的命令行参数及其默认值。当然,也可以在终端用命令行参数修改这些默认值。

下面一个实例展示了tf.app.flags的基本使用方法:

import tensorflow as tf

flags = tf.app.flags
FLAGS = tf.app.flags.FLAGS
flags.DEFINE_integer('training_epoch', 3000, 'number of epochs to train.')
flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.')
flags.DEFINE_string('model_name', 'lstm', 'model name')

def main(_):
    # 输出参数
    print(FLAGS.training_epoch)
    print(FLAGS.learning_rate)
    print(FLAGS.model_name)
if __name__ == '__main__':
    tf.app.run()  #执行main函数 
# 参数的使用
epochs = FLAGS.training_epoch
lr = FLAGS.learning_rate
model = FLAGS.model_name

4. 设置参数运行.py脚本

虽然我们在样例代码中指定了argparse和tf.app.flags的默认参数,但是在实际运行中如果想传入自定义的参数,可以通过命令行模式和pycharm的IDE模式两种方式实现。

假定需要传入的自定义参数为:

training_epoch 为 1000 
learning_rate 为 0.002 
model_name 为 'lstm'

4.1 命令行模式

程序在控制台下运行时格式为:

python test.py --training_epoch 1000 --learning_rate 0.002 --model_name 'lstm'

4.2 pycharm的IDE模式

在pycharm的IDE模式下,我们需要给程序事先指定好输入参数。点击“Run”菜单下的”Edit Configurations…”命令

在这里插入图片描述
在Parameters中填入如下参数:

在这里插入图片描述

参考博客:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/162886.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!