脚本里面经常能看到这句 “if __name__=='__main__':” ,对这段代码的理解一直比较模糊,今天有空,查看了一些资料,先记下以作日后查看。
一、实现效果
首先看这段代码的实现效果,大家都知道我们的python代码既可以作为脚本单独运行,也可以被其python脚本 import 调用,而 “if __name__=='__main__':” 的作用便是控制这两种情况下执行代码的过程,举例:
新建文件:test_a.py
#!/usr/bin/env python
# _*_ encoding: utf-8 _*_
print("hello,张三")
if __name__ == '__main__':
print("hello,李四")
第一种情况,作为脚本独立运行,其输出结果为:
hello,张三
hello,李四
新建文件:test_b.py
#!/usr/bin/env python
# _*_ encoding: utf-8 _*_
import test_a
if __name__ == '__main__':
print("hello,王五")
第二种情况,test_a被其他python脚本import调用时,输出结果为:
hello,张三
hello,王五
可见,test_a中的 “hello,李四” 没有输出,故在一个python脚本被其他脚本import 调用时,该脚本“if __name__=='__main__': 后的代码不会执行,而该脚本独立运行时,“if __name__=='__main__': 后的代码会执行。
二、运行原理
每个python模块都包含内置的变量'__name__',当该模块被直接执行的时候,__name__等同于文件名(包含后缀.py),如果该模块被import到其他模块中,则该模块的__name__等于模块名称(不包含后缀.py),而“__main__”始终指向当前执行模块的名称(包含后缀.py),当模块被直接执行时,__name__ == '__main__' 结果为真。
我们在test_a中打印'__name__',看看结果:
#!/usr/bin/env python
# _*_ encoding: utf-8 _*_
print("hello,张三")
print(__name__)
if __name__ == '__main__':
print("hello,李四")
输出:
hello,张三
__main__
hello,李四
而此时我们再直接运行test_b脚本,其中引用了test_a,其输出为:
hello,张三
test_a
hello,王五
此时,test_a中的__name__ 为test_a,__name__== '__main__' 为假,test_a中 “if __name__=='__main__': ”后面的代码不执行。