tf.app.run()的作用
了解tf.app.run()的作用前,
我们首先看一下app.py这个模块中run()函数的源码:
def run(main=None, argv=None):
"""Runs the program with an optional 'main' function and 'argv' list."""
f = flags.FLAGS
# Extract the args from the optional `argv` list.
args = argv[1:] if argv else None
# Parse the known flags from that list, or from the command
# line otherwise.
# pylint: disable=protected-access
flags_passthrough = f._parse_flags(args=args)
# pylint: enable=protected-access
main = main or sys.modules['__main__'].main
# Call the main function, passing through any arguments
# to the final program.
sys.exit(main(sys.argv[:1] + flags_passthrough))
其中:
f = flags.FLAGS
解释: tf定义了tf.app.flags,用于支持接收命令行传递参数,相当于接收argv。
args = argv[1:] if argv else None
解释: 将传入的参数从第二个开始切片copy到args形成一个列表(第一个为函数名),如果没有则传None。
flags_passthrough = f._parse_flags(args=args)
解释: 该方法确保传入的参数是有效的。
main = main or sys.modules['__main__'].main
解释: 在没有传入主函数参数时,就认为当前模块中已经有一个叫main()的主函数,将main赋给main;
或者在传入主函数参数时,将传入的当前模块自己定义的主函数传给等号左边的main。
sys.exit(main(sys.argv[:1] + flags_passthrough))
解释: 确保传入的参数被正常调用。
简单而言就是:
- 如果你的代码中的入口函数不叫main(),而是一个其他名字的函数,如test(),则你应该这样写入口函数:
tf.app.run(test()[,argv])
程序会先调用test(),并开始执行test()中代码
- 如果你的代码中的入口函数已经有一个叫main()的函数,则你就可以把入口写成
tf.app.run([,argv])
程序就会最先调用main(),并开始执行main()中代码
配合如下代码:
def main(argv=None):
pass
if __name__ == '__main__':
tf.app.run()
其中:
if __name__ == '__main__':
该if语句用来判断,该模块是正在被import还是被SHELL单独运行
被SHELL单独运行时,为True。
可实现:
- 在该模块被import时,main为模块中的一个函数;
- 在使用SHELL执行该模块时,先执行tf.app.run(),该函数检查传入的参数,并确定程序运行入口:
- 在有main()函数时将main()函数作为入口开始执行;
- 在没有main()函数时,从用户自定义的函数入口开始执行。