由解释器在最高层调用执行的语句,不管它是从脚本文件中读入还是来自交互式输入,都是 __main__ 模块的一部分。
而 __name__ 是模块的一个属性。
当解释器直接运行python脚本(假设称之为 demo.py),则在其中print __name__ ,我们会得到的结果是:__main__ 。
而如果是通过别的python脚本(假设称之为demo2.py)来调用(或者说import)时,如果我们输入这样的命令:demo.__name__ ,结果则不是__main__,因为现在运行的是demo2.py , 只有它的__name__的值才是 __main__ 。而如果我们本身在demo.py中就有print __name__ 这样的命令,我们也可以看到,这条语句也不会输出 __main__ , 因为可以理解为 __main__ 是demo2所特权所有的。
那么这有什么用呢?
我们知道我们在import demo.py的时候,功能上相当全部拷贝进demo2.py中去,这样在执行demo2.py的时候demo.py的命令也都会被执行。有时我们只是想要demo.py中定义的一些方法和属性而已。
一般情况下,我们可以在demo.py中只定义我们要的方法和属性,而不去输入命令,这样问题也就差不多解决了,而现在情况有点特殊,我们还想在demo.py放进去一点命令(有时候这是很有必要的),这些命令只有在直接运行demo.py的时候才需要被执行,这个时候,如何避免demo2.py执行过程中还执行了demo.py的命令呢?
解决办法是这样的:
demo.py
if __name__ == '__main__':
"""这里开始写你只想要在demo.py中执行的代码"""
这样,在运行demo2.py的时候,因为在demo.py中,__name__的值为demo,所以你写的代码不会被执行。
而在直接运行demo.py的时候,这是在demo.py中,__name__的值为 __main__,此时你写的代码就会执行了。