致谢:
https://stackoverflow.com/questions/33703624/how-does-tf-app-run-work
https://blog.csdn.net/Suan2014/article/details/76269241
https://blog.csdn.net/fxjzzyo/article/details/80466321
1 形式
if __name__ == '__main__':
tf.app.run()
2关于if __name__ == '__main__':
该语句经常用于自测试。
__name__有两种情况:
为了方便描述将所在文件名定为my_model
.py。
1)当该文件直接运行时,例如执行
python
my_model
.py
__name__数值是__main__,因此会执行if内的语句
2)当该文件以模块形式导入时,例如执行:
import
my_model
__name__数值是my_model
,因此不会执行if内的语句
3关于 tf.app.run()
run源码:
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))
其中语句:
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
).
即run的main如果有参数传入则执行传入参数,如果没有传入则默认在my_model.py
中找main执行。
如果
my_model.py
中即没有main,有不传入参数,则run会报错。
使用
有两种情况:
- 如果代码中的入口函数叫main(),则你就可以把入口写成
tf.app.run(),相当于将tf.app.run(main)中的main参数不传入,缺省情况下run函数找文件中的main执行;
- 如果代码中的入口函数不叫main(),而是一个其他名字的函数,如test(),则你应该这样写入口
tf.app.run(test)
也可以参数显式赋值使用:
import tensorflow as tf
#导入命令行解析模块
import argparse
import sys
FLAGS=None
def main(_):
print(sys.argv[0])
if __name__=="__main__":
#创建对象
parse=argparse.ArgumentParser()
#增加命令行
parse.add_argument('--dataDir',type=str,default='\\tmp\\tensorflow\\mnist\\inputData',
help='Directory for string input data')
FLAGS, unparsed=parse.parse_known_args()
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) #解析命令行参数,调用main函数 main(sys.argv)
4命令行参数:tf.app.flags.DEFINE_xxx
简单易懂有示例:
https://blog.csdn.net/dcrmg/article/details/79658725
tf 中定义了 tf.app.flags.FLAGS ,用于接受从终端传入的命令行参数。例如:
单步执行,可以观察到文件执行的顺序:
1)单行变量操作:flag创建等;
2)函数只执行def声明行,不执行函数内容;
3)如果有if __name__ == '__main__',根据条件执行。