Python中的argparse模块

简介

argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数.
如果你想详细的了解它的功能.建议阅读这个,或者这个
本篇文章只对其基本功能进行介绍,并对TensorFlow的examples中argarse使用进行详细的介绍

功能

原本的功能是命令行解析模块

使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数。那么当你的程序运行时,该解析器就可以用于处理命令行参数。

解析器类是 ArgumentParser 。构造方法接收几个参数来设置用于程序帮助文本的描述信息以及其他全局的行为或设置。

import argparse
parser = argparse.ArgumentParser()
"""
    def __init__(self,
                 prog=None,
                 usage=None,
                 description=None,
                 epilog=None,
                 parents=[],
                 formatter_class=HelpFormatter,
                 prefix_chars='-',
                 fromfile_prefix_chars=None,
                 argument_default=None,
                 conflict_handler='error',
                 add_help=True,
                 allow_abbrev=True):
""""

parser.add_argument() 添加参数

这个方法是用来添加参数的方法,下面是一个示例

    parser.add_argument(
        '--hidden2',
        type=int,
        default=32,
        help='Number of units in hidden layer 2.'
    )

其中help是默认参数,你可以在构造parser 时选择其是否存在,在实际使用中 可以使用 -h 或者 –help调用该参数
第一个参数是字符串,也就是这个参数的名字,之后的参数(除help)都是以**kwargs传入的

def add_argument(self, *args, **kwargs):
"""
        add_argument(dest, ..., name=value, ...)
        add_argument(option_string, option_string, ..., name=value, ...)
        """

        # if no positional args are supplied or only one is supplied and
        # it doesn't look like an option string, parse a positional
        # argument
        # 如果只传入一个参数,那么默认只解析该参数(即使它不是字符串)

之后**kwargs 还有其他参数会被解析,其中type为参数数据类型,default为参数默认值,其他参数请参考argparse的源码

parser.parse_known_args() 获取已知参数

TensorFlow中的实例

FLAGS, unparsed = parser.parse_known_args()
print(FLAGS, unparsed)
print(sys.argv[0])
# 运行结果如下:
# Namespace(batch_size=100, hidden1=128, hidden2=32, learning_rate=0.01, num_epochs=2, train_dir='/tmp/data')
# []

部分源码如下

        if args is None:
            # args default to the system args
            args = _sys.argv[1:]
        else:
            # make sure that args are mutable
            args = list(args)

        # default Namespace built from parser defaults
        if namespace is None:
            namespace = Namespace()
    ...

 #parse the arguments and exit if there are any errors
        try:
            namespace, args = self._parse_known_args(args, namespace)
            if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
                args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
                delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
            return namespace, args
        except ArgumentError:
            err = _sys.exc_info()[1]
            self.error(str(err))

之所以返回的unparsed = [] 就是因为 args 实际 “不存在”

TensorFlow中argparse部分的运行

if __name__ == '__main__':
# 构建parser 
    parser = argparse.ArgumentParser()
    # 设置参数
    parser.add_argument(
        '--learning_rate',
        type=float,
        default=0.01,
        help='Initial learning rate.'
    )
    parser.add_argument(
        '--num_epochs',
        type=int,
        default=2,
        help='Number of epochs to run trainer.'
    )
    parser.add_argument(
        '--hidden1',
        type=int,
        default=128,
        help='Number of units in hidden layer 1.'
    )
    parser.add_argument(
        '--hidden2',
        type=int,
        default=32,
        help='Number of units in hidden layer 2.'
    )
    parser.add_argument(
        '--batch_size',
        type=int,
        default=100,
        help='Batch size.'
    )
    parser.add_argument(
        '--train_dir',
        type=str,
        default='/tmp/data',
        help='Directory with the training data.'
    )
    # 获取设置参数值,此时先前设置的FLAGS已经变成了 Namespace(batch_size=100, hidden1=128, hidden2=32, learning_rate=0.01, num_epochs=2, train_dir='/tmp/data')

    FLAGS, unparsed = parser.parse_known_args()
    # 运行 main 
    # argv=[sys.argv[0]] 为文件名
    # unparsed 为其他参数,但是实际上源码examples中不存在该部分
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
posted @ 2017-08-05 20:44  FontTian  阅读(220)  评论(0编辑  收藏  举报