解决方法
报错内容:
Traceback (most recent call last):
File "main.py", line 376, in <module>
tf.app.run(main) # 首先处理flag解析(命令行参数解析),然后执行main函数
File "/root/anaconda3/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 126, in run
_sys.exit(main(argv))
TypeError: main() takes 0 positional arguments but 1 was given
解决方法:
def main():
修改为:
def main(_): #增加一个下划线
问题原因
tensorflow的app文件中查看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))
逐行分析:
flags_passthrough = f._parse_flags(args=args)
解析命令行输入的参数,保证参数传递,其具体实现是基于Python标准argparse
模块
main = main or _sys.modules['__main__'].main
:如果run函数的main
参数非None,则main为输入参数main;反之,读取模型中的main函数为main
这里有两种情况:
- 如果
my_model.py
中没有main
函数,则应该向tf.app.run
中输入自定义的主函数tf.app.run(main=my_main_running_function)
- 如果
my_model.py
中包含main
函数,则当参数main
为None时,_sys.modules['__main__].main
获取my_model.py
的main函数
最后一行:
sys.exit(main(sys.argv[:1] + flags_passthrough))
: 保证了main(argv) or my_main_running_function(argv) 能够在正确的带有参数,且顺利地执行。
注意:正是最后一行,将参数传给main
函数,即使我们没有输入命令行参数,文件名arg[0]也会传给main
函数,因此自定义main
函数时需要设置参数,故main(_)
是正确的,main()
是不正确的