Python中if name == 'main':的作用和原理
abstract:
参见我的语雀: https://www.yuque.com/jhongtao/zr9a1x/hyqgqk.
python 中name = ‘main’ 的作用,到底是干嘛的?
有句话经典的概括了这段代码的意义:“Make a script both importable and executable”
一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。
因此 if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if name == ‘main’: 下的代码只有在直接作为脚本直接执行时才会被执行,而 import 到其他脚本中是不会被执行的
if name == ‘main’:的运行原理
name
每个python模块(python文件,也就是此处的 one.py 和 two.py)都包含内置的变量 name,当该模块被直接执行的时候,name**** 的值等于当前模块的文件名(包含后缀 .py );如果该模块 import 到其他模块中,则该模块的 name 值等于模块名称(不包含后缀.py)****。
** **'main’
而** ’main’ 始终指当前执行模块的文件名称(包含后缀.py)。进而当模块被直接执行时,name == ’main’ **** 结果为true;当模块被import到其它模块时****,__name__的值为模块名称(不包括文件后缀.py),’main’的值还是模块文件全称(包含文件后缀.py),所以此时****name**** == ****'main’的结果就为false,因此if name == ‘main’**后面的代码不会被执行。
案例说明
one.py模块:
# one.py
# 在one模块中使用if __name__ == '__main__':
# 此时one.py模块的'__main__'的是one.py;__name__的值也是one.py,也就是'__main__'的值
print("__name__.value:" ,__name__)
print ("this is one")
if __name__ == '__main__':
print("process one main")
two.py模块:
# two.py
# 引入one.py模块
# 当模块one.py模块被引入到two.py模块时:
# one.py模块的__name__的值为:one (没有文件扩展名)
# one.py木块的'__main__'的值还视为:one.py (有文件扩展名)
import one
执行:one.py
直接执行 one.py,结果如图,__name__的值为:可以成功 print 两行字符串。即,if name==“main”: 语句之前和之后的代码都被执行。
执行:two.py
执行 import_test.py 脚本,**__name__的值为:one,**只输出了第一行字符串。即,if name==“main”: 之前的语句被执行,之后的没有被执行。
总结一下:
这个功能还有一个用处:调试代码的时候,在”if name=="main“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!