关于模块:在python中, `if name == “__main__”` 是什么意思?

What does `if name == “__main__”` mean in Python?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does do?

我用Python编写脚本已经有很长一段时间了,我根据需要对Python进行了更多的研究。在阅读别人的代码时,我经常遇到if name =="__main__":构造。

它对什么有好处?


这允许您使用同一个文件作为库(通过导入)或作为应用程序的起点。

例如,考虑以下文件:

1
2
3
4
5
6
# hello.py
def hello(to=__name__):
    return"hello, %s" % to

if __name__ =="__main__":
    print hello("world")

您可以通过两种方式使用该代码。首先,您可以编写一个导入它的程序。如果导入库,__name__将是库的名称,因此检查将失败,代码将不会执行(这是所需的行为):

1
2
3
#program.py
from hello import hello # this won't cause anything to print
print hello("world")

如果不想写第二个文件,可以直接从命令行运行代码,如下所示:

1
2
$ python hello.py
hello, __main__

此行为全部取决于特殊变量__name__,python将根据库是由解释器导入还是直接运行来设置该变量。如果直接运行,将设置为__main__。如果导入,它将被设置为库名称(在本例中为hello)。

通常,此构造用于向代码中添加单元测试。这样,当您编写一个库时,您就可以将测试代码直接嵌入到文件中,而不用担心当库以正常方式使用时它会被执行。当您想要测试库时,您不需要任何框架,因为您可以像运行程序一样运行库。

另请参见python文档中的__main__(尽管它非常稀疏)


基本上,

"主"脚本文件和以其他方式导入或引用的外部文件之间存在区别。如果脚本是"主"脚本,那么特殊变量__name__将等于"__main__"

您可以使用它来保护"执行"代码不受脚本所具有的类和变量的影响。这使您能够导入脚本并使用类和变量,而不必实际运行该脚本的主代码(如果有)。

另请参见:如果name="main":做什么?