关于 tf.app.flags() 和 tf.app.run()一头雾水

最近在试着运行一个DCGAN例子,啥也不会。边看边学。

argparse

利用argparse很容易去写用户友好型的命令行接口。

例子:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

        如果在pycharm直接运行会报错,因为没有输入参数。可以在pycharm的run中设置输入参数。设置输入 参数:1  2  3  4  9 后运行结果为9.设置输入参数:1 2 3 4 --sum,运行结果:10。输入:-h,输出:

usage: LEARN.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
  N           an integer for the accumulator

optional arguments:
  -h, --help  show this help message and exit
  --sum       sum the integers (default: find the max)

具体步骤:

一.构造解析器

>>> parser = argparse.ArgumentParser(description='Process some integers.')

ArgumentParser对象将持有的所有信息需要命令行解析成Python数据类型。

二.添加参数

关于填充ArgumentParser的程序参数信息,是通过调用add_argument()方法。一般来说,这些调用告诉ArgumentParser如何在命令行字符串,将它们转化为对象。该信息在parse_args()被调用时存储和使用。

>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',
...                     help='an integer for the accumulator')
>>> parser.add_argument('--sum', dest='accumulate', action='store_const',
...                     const=sum, default=max,
...                     help='sum the integers (default: find the max)')

调用parse_args()之后将返回一个有两个属性的对象:整数、和。

三.解析参数

ArgumentParser 通过parse_args()方法解析参数。这将检查命令行,每个参数转换为适当的类型,然后调用适当的行动。

>>> parser.parse_args(['--sum', '7', '-1', '42'])
Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])

关于argparse的API文档的篇幅很长,以后有时间再看吧。。。

 tf.app.flags

         tf.app.flags和上面的argparse相关。按照大多数博客的介绍,找到flags.py文件。打开后发现和博客里的代码有很大差异,居然少了很多代码。。。大概率是因为升级了。。源码中也没有导入了argparse包。。一些例子也没办法运行:

 
#设置参数,第一个是参数名称,第二个是参数默认值,无默认值可取None,第三个是参数解释
flags.DEFINE_string('str_1', 'hello',
                    'Input a string.')
flags.DEFINE_string('str_2', 'world',
                    'Input a string.')
 
flags.DEFINE_integer('num_1', 0,
                     'Input a integer.')
flags.DEFINE_integer('num_2', 0,
                     'Input a integer.')
 

在新源码中有一个_FlagValuesWrapper类,是absl.flags.FLAGS的“包装类”。不同点:absl.flags.FLAGS是“含蓄地”解析。

tf.app.run()

该函数一般都是出现在这种代码中:

if __name__ == '__main__':#如果是从其它模块调用的该模块程序,则不会运行main函数,否则会运行main
    tf.app.run()

 在app.py中找到源码,源码和博客上的又不一样:

def run(main=None, argv=None):
  """Runs the program with an optional 'main' function and 'argv' list."""

  # Define help flags.
  _define_help_flags()

  # Parse known flags.
  argv = flags.FLAGS(_sys.argv if argv is None else argv, known_only=True)

  main = main or _sys.modules['__main__'].main

  # Call the main function, passing through any arguments
  # to the final program.
  _sys.exit(main(argv))

 注释:定义帮助,解析已知flags,通过参数调用main

 总之还是不懂,只能先积累着吧。。

参考链接:https://www.jianshu.com/p/55cbd3753ee8

https://blog.csdn.net/qq_33757398/article/details/82491411

https://blog.csdn.net/m0_37041325/article/details/77448971

猜你喜欢

转载自blog.csdn.net/zbl1243/article/details/88044055