运行tf.app.run()时引发异常

时间:2018-07-10 13:15:03

标签: python tensorflow flags

此刻,我正在玩弄标志,并且在使用tf.app.run()时遇到了一些奇怪的行为。以下代码段应仅打印通过命令行提供的字符串。

import tensorflow as tf

# command line flags
tf.app.flags.DEFINE_string('mystring', 'Hello World!',
                           '''String to print to console.''')

FLAGS = tf.app.flags.FLAGS


def main():

    print(FLAGS.mystring)

if __name__ == '__main__':
    tf.app.run()

在执行过程中,抛出此错误:

  

回溯(最近通话最近一次):

     

文件“”,第1行,在       runfile('/ path / flags.py',wdir ='/ path')

     

文件   “ /home/abc/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py”,   运行文件中的第710行       execfile(文件名,命名空间)

     

文件   “ /home/abc/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py”,   第101行,在execfile中       exec(compile(f.read(),文件名,'exec'),命名空间)

     

文件“ /path/flags.py”,第19行,在       tf.app.run()

     

文件   “ /home/abc/anaconda3/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/platform/app.py”,   126行       _sys.exit(main(argv))

     

TypeError:main()接受0个位置参数,但给出了1个

...这很奇怪,因为我没有给main()一个参数。但是,如果我添加下划线def main(_):,它将正常工作而不会出现任何错误。

我找不到描述下划线使用的文档。有人知道这里会发生什么吗?谢谢!

3 个答案:

答案 0 :(得分:2)

执行代码时在Pycharm IDE中看到的错误消息更加清晰。

Traceback (most recent call last):
  File "D:/PycharmProjects/TensorFlow/self.py", line 30, in <module>
    tf.app.run()
  File "D:\\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\platform\app.py", 
line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
TypeError: main() takes 0 positional arguments but 1 was given

_sys.exit(main(_sys.argv[:1] + flags_passthrough))试图使用一个参数调用我们的 main 方法。

这是app.py

中的 run 方法

精简版的 run 方法可用于测试。

import tensorflow as tf
import sys as _sys
from tensorflow.python.platform import flags


# command line flags
tf.app.flags.DEFINE_string('mystring', 'Hello World!',
                           '''String to print to console.''')

FLAGS = tf.app.flags.FLAGS

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

  print (_sys.argv[:1])

  # Call the main function, passing through any arguments
  # to the final program.
  #_sys.exit(main(_sys.argv[:1] + flags_passthrough))

  # Call the main function with no arguments
  #_sys.exit(main())


def main():
    print(FLAGS.mystring)

if __name__ == '__main__':
    #tf.app.run()
    run()

print(_sys.argv[1:])打印['D:/PycharmProjects/TensorFlow/self.py'],因为 argv [0]是传递给解释器的脚本名称。

答案 1 :(得分:1)

也许您可以从此链接中找到答案,以解释app.py的运行方式how app.py runs

您还可以使用def main(argv=None): ...定义主函数,或者像def main(_): ...那样定义主函数,这样可以使其在给定主函数参数的情况下起作用。

答案 2 :(得分:0)

使用cProfile并使用

调用脚本时,我遇到了类似的问题
python -m cProfile train.py

似乎问题在于tf.app.run在cProfile内部称为main,尚未准备好传递参数。在我的情况下,解决方案是在tf.app.run()中指定main:

tf.app.run(main=main)

不要忘了像def main(_):这样在main中添加伪参数。