我正在玩标志,在使用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()
在执行期间,将引发此错误:
Traceback (most recent call last):
File "", line 1, in runfile('/path/flags.py', wdir='/path')
File "/home/abc/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 710, in runfile execfile(filename, namespace)
File "/home/abc/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 101, in execfile exec(compile(f.read(), filename, 'exec'), namespace)
File "/path/flags.py", line 19, in tf.app.run()
File "/home/abc/anaconda3/envs/tensorflow/lib/python3.5/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
…这很奇怪,因为我没有给main()一个参数。但是,如果我添加一个下划线def main(_):
,它可以正常工作而不会出现任何错误。在
我找不到一个文档,其中描述了下划线的用法。有人知道这里发生了什么吗?谢谢您!在
当我执行代码时,我在pycharmide中看到的错误消息更清晰。在
_sys.exit(main(_sys.argv[:1] + flags_passthrough))
正试图用一个参数调用我们的main方法。在这是app.py中的run方法
一个精简版的运行方法可以用于测试。在
^{2}$print(_sys.argv[1:])
打印['D:/PycharmProjects/TensorFlow/self.py']
自 argv[0]是传递给解释器的脚本名。在也许您可以从这个链接找到解释
app.py
如何运行{a1}的答案您也可以使用
def main(argv=None): ...
来定义主函数,或者像您一样使用def main(_): ...
来定义主函数,这样就可以为您提供主函数参数了。在我在使用cProfile和调用脚本时遇到了类似的问题
看来问题是运行tf.app.run调用了cProfile内部的main,它还没有准备好传递参数。在我的例子中,解决方案是在
^{2}$tf.app.run()
中指定main:别忘了添加这个参数。在
相关问题 更多 >
编程相关推荐