经常在Python脚本的最后看到有这样的语句:
if __name__ == '__main__': main()
那么这是什么意思呢?
__name__是什么?
__name__是当前模块(脚本文件)的一个属性,当直接运行当前脚本时,__name__的值是'__main__'。
而当当前模块(脚本文件)被其他脚本import时,它的__name__属性的值为模块名。
举个例子:
脚本文件1:print_array.py
脚本文件1定义了一个名为my_fun()的函数。
#!/usr/bin/env python#-*- coding:utf-8 -*-import numpy as npdef my_fun(): n = input("Input a single positive odd integer greater than 2: ") while True: try: n = int(n) if (int(n) % 2 == 0 or int(n) < 2): n = input("Oops, you have given a WRONG number! Please input a single positive odd integer greater than 2: ") else: break except: n = input("Oops, you have given a WRONG number! Please input a single positive odd integer greater than 2: ") print ("n = %s" %n) a = np.zeros((n, n), dtype=int) m = n // 2 a[:, m] = 1 a[m, :] = 1 print (a)def main(): my_fun()if __name__ == '__main__': main()
脚本文件2:main_test.py
脚本文件2对脚本文件1进行了调用。
#!/usr/bin/env python#-*- coding:utf-8 -*-import print_arrayprint (print_array.__name__)print (__name__)
开始测试:
第一步:直接执行print_array.py,my_fun()函数被运行,结果如下:
第二步:直接执行main_test.py,my_fun()函数没有被运行,结果如下:
由此可以看出,print_array.py中增加了对__name__属性的判断后,在被main_test.py调用时,不会运行my_fun()函数。
同时,在执行main_test.py时,pring_array的__name__属性的值为'print_array',而main_test.py本身的__name__属性值为'__main__'。
第三步:对print_array.py作一些修改,去掉对__name__属性的判断,改为直接运行my_fun()函数:
第四步:再次执行main_test.py,结果如下:
可以看到在import print_array时,print_array.py中的my_fun()函数同时被运行了。
总结
通过以上几个步骤,可以看出if __name__ == '__main__' 在脚本中起到的作用。
模块作为脚本独立执行时,__name__ == '__main__'的结果为True,if中的语句会被运行。
模块作为被其他脚本调用的子模块时,脚本文件中的__name__ == '__main__'的结果为False,if中的语句不会被运行。
因此,如果模块不存在被调用的场景,这句话可以省略。如果存在被调用的场景,那么是必不可少的。