最近在试着运行一个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