文章目录

  • 1. python的sys.argv
  • 2. python的argparse包
  • 2.1 argparse的基本用法
  • 2.2 ArgumentParser.add_argument()传参
  • 2.3 add_argument()传参为list类型
  • 3. tf.app.flags组件
  • 3.1 tf.app.flags的基本用法
  • 4. 设置参数运行.py脚本
  • 4.1 命令行模式
  • 4.2 pycharm的IDE模式


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

Python 向bat传递参数 python 传参数 脚本_python

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

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

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

1. python的sys.argv

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

使用sys.argv接收上面第一个命令中包含的参数方式如下:

Python 向bat传递参数 python 传参数 脚本_命令行参数_02

Python 向bat传递参数 python 传参数 脚本_命令行参数_03

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() 参数详解:

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的函数中即可。

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…"命令

Python 向bat传递参数 python 传参数 脚本_Python 向bat传递参数_04


在Parameters中填入如下参数:

Python 向bat传递参数 python 传参数 脚本_命令行_05

参考博客: