tf.app.run()
Tensorflow 翻訳デモはどのように機能しますか?
ではtensorflow/models/rnn/translate/translate.py
、 への呼び出しがありますtf.app.run()
。これはどのように処理されていますか?
if __name__ == "__main__":
tf.app.run()
ベストアンサー1
if __name__ == "__main__":
現在のファイルはモジュールとしてインポートされるのではなく、シェルの下で実行されることを意味します。
tf.app.run()
ファイルからわかるように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))
1行ずつ分解してみましょう:
flags_passthrough = f._parse_flags(args=args)
これにより、コマンドラインで渡す引数が有効であることが保証されます。python my_model.py --data_dir='...' --max_iteration=10000
実際、この機能は Python 標準argparse
モジュールに基づいて実装されています。
main = main or sys.modules['__main__'].main
main
の右側の最初の部分は=
、現在の関数の最初の引数ですrun(main=None, argv=None)
。一方、はsys.modules['__main__']
現在実行中のファイル (例my_model.py
) を意味します。
つまり、2 つのケースが考えられます。
main
関数がないmy_model.py
場合は、呼び出す必要がありますtf.app.run(my_main_running_function)
main
に関数がありますmy_model.py
。(ほとんどの場合はそうなります。)
最後の行:
sys.exit(main(sys.argv[:1] + flags_passthrough))
main(argv)
またはmy_main_running_function(argv)
関数が解析された引数で適切に呼び出されることを保証します。