Python中if __name__ == ‘__main__‘:的原理
作用
我们知道.py
文件通常有两种使用方法:
- 作为脚本直接执行
import
到其他的python 脚本
中被调用(模块重用)执行。
因此if __name__ == '__main__':
的作用就是控制这两种情况执行代码的过程,在if __name__ == '__main__':
下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。举例说明如下:
1. 当文件作为脚本直接执行时:
创建一个test.py文件,内容如下:
print('hello world')
if __name__ == '__main__':
print('bye bye world')
直接执行 test.py
,结果如下图,可以成功 print
两行字符串。即,if __name__=="__main__":
语句之前和之后的代码都被执行。
输出如下:
hello world
bye bye world
2.当文件被 import 到其他的 python 脚本中被调用时
然后在同一文件夹新建名称为import_test.py
的脚本,输入如下代码:
import test
执行import_test.py
脚本,输出结果如下:
hello world
只输出了第一行字符串。即,if __name__=="__main__":
之前的语句被执行,之后的没有被执行。
运行原理
每个python
模块(python
文件,也就是此处的 test.py
和import_test.py
)都包含内置的变量 __name__
,当该模块被直接执行的时候,__name__
等于__main__
;如果该模块 import
到其他模块中,则该模块的 __name__
等于模块名称即test
(不包含后缀.py)。
而“__main__”
始终指当前执行模块的名称(包含后缀.py)。进而当模块被直接执行时,__name__ == 'main'
结果为真。
为了进一步说明,我们在 test.py
脚本的if __name__=="__main__":
之前加入print(__name__)
,即将 __name__
打印出来。文件内容和结果如下:
print('hello world')
print('__name__:', __name__)
if __name__ == '__main__':
print('bye bye world')
直接执行 test.py
,结果如下图,可以成功 print
两行字符串。即,if __name__=="__main__":
语句之前和之后的代码都被执行。
输出如下:
hello world
__name__: __main__
bye bye world
可以看出,此时变量__name__
的值为__main__
。
再执行 import_test.py
,执行结果如下:
import test
执行import_test.py
脚本,输出结果如下:
hello world
__name__: test
此时,test.py
中的__name__
变量值为 test
,不满足 __name__=="__main__"
的条件,因此,无法执行其后的代码。