前言:本文介绍python中两种常见的命令行处理方法,一种是通过argparse库来实现,一种是使用tensorflow来实现。
1.1 定义参数的方法
import argparse
parser = argparse.ArgumentParser(description='some description') # 定义一个 parser 对象
# 定义参数
parser.add_argument('--exp_name', type=str, default='debug_vx', help='help information')
parser.add_argument('--batch_size', type=int, default=10, help='help infprmation')
parser.add_argument('--learning_rate', type=float, default=0.001,help='help infprmation')
parser.add_argument('--no-cuda', type=boolean, default=False,help='help infprmation')
注意,parser.add_argument()这个函数的参数有很多,一般由上面的四个参数就足够了,即:
# 定义参数
parser.add_argument('--name', type=str, default='default_value', help='help information')
但是,我们在使用的时候,还有很多其他的参数需要注意,比如:
default:设置参数的默认值
type:把从命令行输入的结果转成设置的类型
help:参数命令的介绍
----------------------------------------------------------------------------------------------------------------------------
dest:如果提供dest,例如dest="a",那么可以通过args.a访问该参数
action:参数出发的动作, action=’store_true’ ,表示的是开关的作用,什么意思呢?即只要在运行的时候使用了该参数, 该参数的值就是True.
store:保存参数,默认
store_const:保存一个被定义为参数规格一部分的值(常量),而不是一个来自参数解析而来的值。
store_ture/store_false:保存相应的布尔值
append:将值保存在一个列表中。
append_const:将一个定义在参数规格中的值(常量)保存在一个列表中。
count:参数出现的次数
parser.add_argument("-v", "--verbosity", action="count", default=0, help="increase output verbosity")
version:打印程序版本信息
choice:允许的参数值,例如上面choices=【1,5,10】表示输入参数只能为1或5或10
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity")
required:用来设置在命令中显示参数,当required为True时,在输入命令时需要显示该参数
metavar:用在help信息的输出中
1.2 获取命令行参数的值
依然以上面定义的四个命令行参数为例
args = parser.parse_args() # 调用parse_args()函数
print(args.exp_name) # 获取 --exp_name参数的值
print(args.batch_size) # 获取 --batch_size参数的值
print(args.learning_rate) # 获取 --learning_rate参数的值
print(args.no-cuda) # 获取 --no-cuda参数的值
2.1 定义参数的方法
(1)方式一:
flags = tf.app.flags # 构建一个flags对象
# 通过flags对象定义参数
flags.DEFINE_string('model', 'graphsage', 'description') # string
flags.DEFINE_float('learning_rate', 0.00001, 'description.') # float
flags.DEFINE_integer('dim', 128, 'description') # int
flags.DEFINE_boolean('random_context', True, 'description') # bool
(2)方式二:
# 直接通过tf.app.flags定义参数
tf.app.flags.DEFINE_string('model', 'graphsage', 'description') # string
tf.app.flags.DEFINE_float('learning_rate', 0.00001, 'description.') # float
tf.app.flags.DEFINE_integer('dim', 128, 'description') # int
tf.app.flags.DEFINE_boolean('random_context', True, 'description') # bool
总结:定义命令行参数的一般方法:
tf.app.flags.DEFINE_xxxx('参数名称', 参数值, '参数描述')
# 另外需要注意的是,与argparse不同的是,这里的参数名称我们不需要添加两个短横线--
2.2 获取命令行参数的值
依然以上面定义的几个参数为例:
flags = tf.app.flags
FLAGS = flags.FLAGS # 实际上就是tf.app.flags.FLAGS
print(FLAGS.model) # 获取model参数值
print(FLAGS.learning_rate) # 获取learning_rate参数值
print(FLAGS.dim) # 获取dim参数值
print(FLAGS.random_context) # 获取random_context参数值
2.3 使用tensorflow代替python的main函数
首先定义一个入口主函数main,当然这里的名称不一定要是main,也可以是其他的名字:
def main(args=None):
pass
启动:
if __name__ == '__main__':
tf.app.run() # 这里默认的是使用了定义的main函数,而且没有传递参数
查看一下tf.app.run()的定义如下:
def run(main=None, argv=None):
'''
main: 表示要启动的函数名称,如果是定义的main,则这个参数可以不用传递,默认启动main
argv: 需要启动的函数的参数
'''