tf.app.run()的作用

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()函数时,从用户自定义的函数入口开始执行。

猜你喜欢

转载自blog.csdn.net/liuxiaodong400/article/details/80904342