How does tf.app.run() work?
if __name__ == "__main__":
means current file is executed under a shell instead of imported as a module.
tf.app.run()
As you can see through the file app.py
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))
Let's break line by line:
flags_passthrough = f._parse_flags(args=args)
This ensures that the argument you pass through command line is valid,e.g. python my_model.py --data_dir='...' --max_iteration=10000
Actually, this feature is implemented based on python standard argparse
module.
main = main or sys.modules['__main__'].main
The first main
in right side of =
is the first argument of current function run(main=None, argv=None)
. While sys.modules['__main__']
means current running file(e.g. my_model.py
).
So there are two cases:
You don't have a
main
function inmy_model.py
Then you have tocalltf.app.run(my_main_running_function)
you have a
main
function inmy_model.py
. (This is mostly the case.)
Last line:
sys.exit(main(sys.argv[:1] + flags_passthrough))
ensures your main(argv)
or my_main_running_function(argv)
function is called with parsed arguments properly.
It's just a very quick wrapper that handles flag parsing and then dispatches to your own main. See the code.
There is nothing special in tf.app
. This is just a generic entry point script, which
Runs the program with an optional 'main' function and 'argv' list.
It has nothing to do with neural networks and it just calls the main function, passing through any arguments to it.