本文翻译自Stack Overflow上关于Python的What does if __name__=="__main__":do?
网址:https://stackoverflow.com/questions/419163/what-does-if-name-main-do/419185#419185
首先,介绍下什么是Stack Overflow。
Stack Overflow是一个与程序相关的IT技术问答网站。用户可以在网站免费提交问题,浏览问题,索引相关内容,在创建主页的时候使用简单的HTML。在问题页面,不会弹出任何广告,销售信息,JavaScript 窗口等。(来源360百科)
Stack Overflow是一个比较有名的问题问答网站,在上面也会有很多国内外大神用简单易懂的说法来解决你提出的问题,但,同时你也要会提问题。具体怎么玩转Stack Overflow的提问,大家可以看看这篇文章http://blog.jobbole.com/101980/
今天,我们翻译的问题是What does if __name__ == “__main__”: do?
提问人:Devoted
问题:if __name__ == "__main__":
是做什么用的?
# Threading example
import time, thread
def myfunction(string, sleeptime, lock, *args):
while True:
lock.acquire()
time.sleep(sleeptime)
lock.release()
time.sleep(sleeptime)
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
在这里我先对这个问题解释下,相信大家在开始学python的时候,教程里每次写完一段程序进行调试的时候,总会先在文末加上这么一个判断语句:If __name__=="__main__":大家可能会有疑惑,为什么是要加这个东西呢,我直接就运行函数不就好了吗?加这个有什么用呢?接下来,我们就听大神来给我们分析分析。
回答者:Mr Fooz
当python的解释器在解析一段代码的时候,他会执行所有他能找到的代码。
假设我们当前文件是a.py,另外一个文件是b.py
在执行代码之前,python会定义一些特殊的变量。例如,如果python解释器将这个文件(a.py)作为主程序运行的时候,会将特殊变量__name__赋值为"__main__",但如果这个文件(a.py)被另外一个文件(b.py)当做模块import的时候,__name__就会被赋值为主模块(b.py)的名字。
在你列举的脚本中,如果我们假设你的文件被当做主程序来运行。
python threading_example.py
在命令行上运行你的代码。python解释器设置好特殊变量之后,他会执行import语句并加载这些模块。然后评估def块,创建函数对象并创建一个名为的myfunction的函数变量的对象。接着,他会读取if语句并看到__name__是等于"__main__",所以他就执行下面的代码块。
这样做的一个原因是,有时候你写一个模块(a.py)的时候他能直接运行。或者,他能被import到其他模块中运行。通过主程序的检查,你能让a.py只在你需要用到的时候才去执行并且在别人只需要导入模块并自行调试您的函数时不会执行。
回答者:PI。
变量__name__最简单的解释如下
创建如下文件:
# a.py
import b
还有
# b.py
print "Hello World from %s!" % __name__
if __name__ == '__main__':
print "Hello World again from %s!" % __name__
运行后你会看到这么一个输出结果:
$ python a.py
Hello World from b!
正如你所看到的,当一个模块被导入时,Python会globals()['__name__']
在这个模块中设置模块的名字。
$ python b.py
Hello World from __main__!
Hello World again from __main__!
正如你所看到的,当一个文件被执行时,Python会globals()['__name__']
在这个文件中设置"__main__"
。
总结以上:
看完以上两个回答,不知道大家理清了这个__name__特殊函数的使用方法了没,如果没,我就再啰嗦一下,举个中文例子。
# a.py
print ("这是文件a.py函数外,此时的__name__的值为%s" %__name__)
def a():
print("这是文件a.py内的函数a(),此时的__name__的值为%s" %__name__)
a()
# b.py
import a
python b.py
>>这是文件a.py函数外,此时的__name__的值为a
>>这是文件a.py内的函数a(),此时的__name__的值为a
首先我们要先理解下import这个技能,一般情况下,我们直接在b.py中import a.py模块的时候,会将a.py中所有的代码都执行一遍,所以大家设想一下,如果我们a.py中定义好函数后没有加上if __name__ == "__main__":这个判断就直接运行我们所需要的函数的话,那在导入的时候,a.py所有代码就都执行了个遍,这有时候并不是我们需要的结果,我们可能只需要引用a.py中的个别函数而已。这个时候__name__的作用就凸显出来了。有了他,我们既能在单独的a.py中执行我们需要的函数,又能在import的时候自由的引用所需的函数,可谓是一举两得。
__name__的值又是会根据不同场景发生变化的,当作为主程序运行的时候他就等于"__main__",但他被import时就为原文件的名称。而主程序中的__name__永远为__main__。
欢迎大家关注我的微信公众号Python小黑屋
python学习资源/有趣的python文章/python学习笔记