关于python编程中经常看到的如下写法:

if __name__ =="__main__":

为什么这样写?与__main__作用有关。

__main__代表最高层级代码环境。什么叫做最高层级代码环境?就是程序的入口程序。

 

当一个python模块或者包是被引入的时候,__name__的值就是他的名字,即去掉.py后缀的部分。

例子:

import sys



print(sys.__name__)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

结果:

关于__name__ == “__main__”的说明_python

如果这个文件是包的一部分,那么__name__将包含父包的路径。

例子:

from concurrent.futures import process



print(process.__name__)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

结果:

关于__name__ == “__main__”的说明_全局变量_02

如果是在当前的python文件内,则__name__是__main__

例子:

def hello():

    print('hello world!')

    print(__name__)



if __name__ == "__main__":

    hello()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

结果:

关于__name__ == “__main__”的说明_python模块_03

常用法及特点

因为卸载 if __name__ == “main”中的代码不会在该文件被别的文件引用时执行,所以可以将一些测试的代码,或其他用处的代码写在这里面。

如果不写在这里面,而是直接写在文件中,那么这部分代码将被自动执行。

例子:test2.py

 

def hello():

    print('hello world!')

    print(__name__)



def hello2():

    print('hello world2!')

    print(__name__)



if __name__ == "__main__":

    hello()



hello2()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

结果:直接运行test2.py时候,hello和hello2都将被执行。

关于__name__ == “__main__”的说明_python_04

但是:

在test3.py中引入test2.py时,运行test3.py时候,只有hello2被自动执行了,包含在if __name__ == "__main__":判断语句中的hello方法并没有执行。

 

import test2



print('这是test3.py,他引入了test2.py文件,')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

结果:

关于__name__ == “__main__”的说明_全局变量_05

因为当python程序a.py被别的python程序b.py引入时,实际上该python程序是自动从上至下执行的,因为这个时候__name__的值时b,而非__main__,所以其中代码不会被执行。不过这其中的代码,在正式投产时是不应该被保存的。

还一点主意,在if __name__ == "__main__":中定义的变量对于整个模块来讲是全局变量,因此,尽量将变量和函数逻辑进行封装,而不是在此进行定义或者处理,