运行 tf.app.run() 时抛出异常

Doc*_*ven 4 python flags tensorflow

我现在正在玩标志,并在使用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()
Run Code Online (Sandbox Code Playgroud)

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

回溯(最近一次调用最后一次):

File "", line 1, in 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(), filename) , '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))

类型错误:main() 采用 0 个位置参数,但给出了 1 个

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

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

Moh*_*nan 5

当我执行你的代码时,我在 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
Run Code Online (Sandbox Code Playgroud)

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

这是app.py 中run方法

可以使用run方法的精简版本进行测试。

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
Run Code Online (Sandbox Code Playgroud)

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