python 中__name__ = '__main__' 的作用

Python Script 是应用广泛的一种批量自动化处理方案,同时任何的.py扩展文件在Python执行程序中都可以充当Module文件来使用。从Python一切皆对象的设计理念来说,只要将.py的扩展文件导入Python执行程序中后,我们就可以使用一些Python的内置方法。

#hello.py
def sayHello():
    str="hello"
    print(str);
if __name__ == "__main__": #main program 程序入口
    print ('This is main of module "hello.py"')
    sayHello()

当单独执行该module时,比如单独执行以上hello.py: python hello.py,则输出

This is main of module "hello.py"
hello

可以理解为"if __name__=="__main__":" 这一句与c中的main()函数所表述的是一致的,即作为入口

当该module被其它module 引入使用时,其中的"if __name__=="__main__":"所表示的Block不会被执行,这是因为此时module被其它module引用时,其__name__的 值将发生变化,__name__的值将会是module的名字。比如在python shell中import hello后,查看hello.__name__:

>>> import hello
>>> hello.__name__
'hello'
>>>

有句话经典的概括了这段代码的意义:“Make a script both importable and executable

意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。

在cmd 中直接运行.py文件,则__name__的值是'__main__';
而在import 一个.py文件后,__name__的值就不是'__main__'了;
用if __name__ == '__main__'来判断是否是在直接运行该.py文件

这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。

总结一下:
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

posted @ 2017-11-02 11:34  sangern  阅读(1318)  评论(0编辑  收藏  举报