简介:
__name__是当前模块名,当模块被直接运行时模块名为_main_,也就是当前的模块,当模块被导入时,模块名就不是__main__,即代码将不会执行。
关于代码if __name__ == '__main__': 下面举几个例子解释下:
先编写一个测试模块add1.py
#!/usr/bin/env python3#-*- coding: utf-8 -*-
'a test module'
defaddFunc(a,b):return a+bprint('add1计算结果:',addFunc(1,1))
再编写一个模块add2.py来调用上面的模块:
#!/usr/bin/env python3#-*- coding: utf-8 -*-
'a test module'
importadd1print('调用add1模块执行的结果是:',add1.addFunc(12,23))
在刚才两个模块的路径(我的路径为:“C:\work”)中打开cmd,用命令行运行add1.py:
C:\work>python add1.py
add1计算结果:2
在刚才两个模块的路径中打开,用命令行运行add2.py:
C:\work>python add2.py
add2计算结果:2调用add1模块执行的结果是:35
#显然,当我运行add2.py后第一句并不是调用者所需要的,为了解决这一问题,Python提供了一个系统变量:__name__ #注:name两边各有2个下划线__name__有2个取值:当模块是被调用执行的,取值为模块的名字;当模块是直接执行的,则该变量取值为:__main__
于是乎,被调用模块的测试代码就可以写在if语句里了,如下:
#!/usr/bin/env python3#-*- coding: utf-8 -*-
'a test module'
defaddFunc(a,b):return a+bif __name__ == '__main__':print('add1计算结果:',addFunc(1,1))
当再次运行add1.py:
C:\work>python add1.py
add1计算结果:2
#结果并没有改变,因为调用add1.py时,__name__取值为__main__,if判断为真,所以就输出上面的结果
当再次运行add2.py:
C:\work>python add2.py
调用test模块执行的结果是:35
#此时我们就得到了预期结果,不输出多余的结果。能实现这一点的主要原因在于当调用一个module时,此时的__name__取值为模块的名字,所以if判断为假,不执行后续代码。
所以代码iif __name__ == '__main__': 实现的功能就是Make a script both importable and executable,也就是说可以让模块既可以导入到别的模块中用,另外该模块自己也可执行。
学过c语言的话,可以知道C语言定义主程序入口就是main()函数,main代表了程序主入口,即和系统的接口(说白了就是命令行直接调用)。if name == 'main': 这句话的核心无非就是在判断该程序文件是否作为主程序入口罢了。 如果在命令行直接调用该程序文件,该文件作为主程序入口,name == 'main'理所当然啊。 如果在命令行调用其他程序文件,主程序入口name == 'main'自然不成立,因为main等于那个你在命令行输入的程序名。 这个东西的好处就是,别人调用时(你并非是主程序入口)后面的东西不运行,自己命令行执行时(你是主程序入口)后面的东西运行。故可以作为测试用。