对于刚接触python的初学者来说,经常会发现一些python代码文件最后会有这么一段
if __name__ == '__main__' :
main()
....
那么这句话是什么意思呢?
有句话经典的概括了这段代码的含义: “Make a script both importable and executable”
意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。这句话,可能一开始听的还不是很懂。
通俗的理解__name__ == '__main__':
假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');
在你自己眼中,你是你自己(__name__ == '__main__')。
if __name__ == '__main__'的意思是:
当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;
当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
下面我们举例来说明。
先写一个模块(或者说第一个.py文件)
# first.py
def main():
print('we are in %s' % __name__)
if __name__ == '__main__':
main()
print('-----------ending---------')
直接运行first.py文件,运行结果是:
we are in __main__
-----------ending---------
通过运行结果,我们可以分析出:
当我们直接运行first.py文件,__name__的值就是 __main__。也就是上文所说的“在你自己眼中,你就是你自己”
然后我们再写另一个模块(或者说另一个.py文件)
# second.py
from first import main # 将first.py文件以模块形式导入sencond.py文件
main() # 调用first.py文件中的main方法
我们运行second.py文件,运行结果是:
we are in first
通过运行结果,我们可以分析出:
一、当我们将first.py文件以模块形式导入sencond.py文件,__name__的值就是 first。也就是上文所说的“在你朋友(second)的眼中,你是你(first)”
二、我们发现 first.py文件中的if语句之后的代码没有被运行,因为此时的__name__是first,而不是__main__。
总结:
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但如果我们从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!