Python中if name == 'main':的作用和原理

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

image.png
直接执行 one.py,结果如图,__name__的值为:可以成功 print 两行字符串。即,if name==“main”: 语句之前和之后的代码都被执行。

执行:two.py

image.png
执行 import_test.py 脚本,**__name__的值为:one,**只输出了第一行字符串。即,if name==“main”: 之前的语句被执行,之后的没有被执行。

总结一下:

这个功能还有一个用处:调试代码的时候,在”if name=="main“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章