最新消息: 新版网站上线了!!!

python __name__ 和 __main__之间的关系,if __name__ == '__main__'的作用是什么

在python模块是对象,所有模块都有一个内置属性__name__ 。

__name__  是一个变量(属性),输出的值有2可能

blob.png

一、什么情况输出值为__mian__?什么情况输出值为脚本文件名称?

实例:http://www.3qphp.com/python/pybase/127.html

1、文件t.py

#定义一个方法t(),通过print打印输出__name__的值
def t():
    print('我是'+__name__+'文件')
#属性__name__的值等于__main__时执行t()方法
if __name__=='__main__':
    t()

2、文件str.py

#引入t.py文件(模块)
import t

a、只执行t.py脚本看看结果

blob.png

结果是t()方法被执行了,说明执行t.py时__name__输出的值为__main__ ,而且从print('我是'+__name__+'文件')打印的结果也看出来了的确如此

b、只执行str.py脚本文件看看结果

blob.png

执行结果发现是空白为什么?str.py执行时,首先引入了t.py文件,引入之后执行t.py中的脚本时,发现__name__的值并不等于__main__所以就没有执行t()方法。那么执行str.py时__name__的值为多少?它的值其实为t,具体原因后面讲解,这里先看一个反例证明一下

修改t.py脚本中的代码如下:

修改中删除了if __name__=='__main__':判断直接调用t()方法

#定义一个方法t(),通过print打印输出__name__的值
def t():
    print('我是'+__name__+'文件')
t()

看看修改t.py之后执行str.py的结果

blob.png

发现输出的结果有内容了,而且结果中__name__的值变成了t,而不是之前的__main__

总结说明:

 1. 模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。

2. python手册中的原文解释

'__main__' is the name of the scope in which top-level code executes. A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt.

A module can discover whether or not it is running in the main scope by checking its own __name__, which allows a common idiom for conditionally executing code in a module when it is run as a script or with python -m but not when it is imported:

if __name__ == "__main__":    # execute only if run as a script    main()

3. if __name__ == "__main__"

有句话经典的概括了这段代码的意义:

“Make a script both importable and executable”

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

作用:当前脚本文件被直接执行时,才运行if __name__ == '__main__'作用域下的代码块,如果脚本文件被引入到其他文件中在执行的话,不运行if __name__ == '__main__'作用域下的代码块。

这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!http://www.3qphp.com/python/pybase/127.html</</a>a>


转载请注明:谷谷点程序 » python __name__ 和 __main__之间的关系,if __name__ == &#039;__main__&#039;的作用是什么