if __name__ == '__main__' 的理解
看廖雪峰老师的教程时,他的解释是:
import sys
def test():
args = sys.argv3
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
if __name__=='__main__':
test()
当我们在命令行运行hello模块文件时,Python
解释器把一个特殊变量__name__
置为__main__
,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试
感觉不是很清晰,所以我试图清晰一下—_—:
他的作用是:
1.作为脚本直接执行
2.是导入( import
) 到其他的 python
脚本中时被调用(模块重用)执行。
也就是说,这段代码是在脚本被直接执行或被调用时起作用,直接执行if
判断为真,被调用if
判断为假不执行。
例子:
'yy.py'
# -*- coding: utf-8 -*-
print('我在if __name__ == \'__main__\'外')
print(__name__)
print(__name__== '__main__')
if __name__ == '__main__':
print( '我在if __name__ == \'__main__\'内')
'直接执行结果:'
我在if __name__ == '__main__'外
__main__
True
我在if __name__ == '__main__'内
可以看到if __name__ == '__main__':
语句上下都执行了,且在直接执行脚本时,Python
解释器把__name__
置为__main__
,if
判断为真
把yy.py模块导入到cc.py中:
'cc.py'
# -*- coding: utf-8 -*-
import yy
print(__name__)
print(__name__=='__main__')
'执行结果:'
我在if __name__ == '__main__'外#yy.py
yy #yy.py yy.py模块被其他脚本调用时,__name__等于文件名
False#yy.py __name__不等于'__main__'
__main__
True
可以看到if __name__ == '__main__':
语句只有上面被执行了,if __name__ == '__main__'
内没有被执行。
总结:
要弄清晰亿点点。应该先知道,'__main__'
是等于当前执行文件的名称(包含了后缀.py)。
因此:
当脚本yy.py
被直接执行时:__name__
被置为'__main__'
,都等于文件名(包含了后缀.py),也就是yy.py
.
当yy.py被导入到其他脚本(这里是cc.py)时,再执行cc.py时,调用yy模块,yy模块的__name__
被置为文件名(yy,而不包含后缀.py),因此两者不相等,也就不会继续向下执行。