作者:张steel
链接:https://www.zhihu.com/question/58646802/answer/158556775
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处
python中目录可以理解成一个包(package),一个源文件可以备理解成一个模块(module)。当你写了一个python文件时,有两种方式可以使用它,一种是直接调用(python example.py),一种是将它import到另一个模块中使用(比如在模块another_example.py中使用语句——import example)。python 解释器在执行一个module里面的代码之前,会定义一些特殊的变量。就比如题主所问中的__name__变量。如果是解释器将这个module作为主程序去执行的时候(上面的第一种方式),它会将__name__设置成值: __main__。如果这个module是被其他module import的话(上面第二种方式),那么它的__name__会被设置成它的模块名。下面代码展示了__name__的值会随着调用该模块的方式不同而不同。[root@108 testproject]# cat example.py
print "The value of __name__ is: " , __name__
[root@108 testproject]# cat another_exampel.py
import example
[root@108 testproject]# python example.py
The value of __name__ is: __main__
[root@108 testproject]# python another_exampel.py
The value of __name__ is: example
知道了__name__不同值的意义,我们再来看“if __name__ == '__main__'”就很好理解了。当你直接调用我时,if 条件为True,if 里面的代码段才会执行。如果你是import 我,那么if 条件为False, if 里面的代码段就不执行啦。有了if __name__ == '__main__', 你可以在当前模块内验证模块的功能而不会影响import该模块的其他模块。例如,python官方库中wsgiref 实现了一个符合wsgi规范的web服务器,在它源码的最后,给出了一个如何用wsgiref起一个web服务的简单步骤。if __name__ == '__main__':
httpd = make_server('', 8001, demo_app)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
import webbrowser
webbrowser.open('http://localhost:8000/xyz?abc')
httpd.handle_request() # serve one request, then exit