在Python中`if name ==“__ main __”是什么意思?

时间:2011-11-22 07:05:34

标签: python module scope

  

可能重复:
  What does <if name==“main”:> do?

我已经在Python中编写了很长一段时间的脚本,而且我在需要的时候学习了更多的Python。在阅读其他人的代码时,我经常会遇到if name == "__main__":

有什么好处?

2 个答案:

答案 0 :(得分:23)

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

例如,请考虑以下文件:

# hello.py
def hello(to=__name__):
    return "hello, %s" % to

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

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

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

如果您不想编写第二个文件,可以直接从命令行运行代码,例如:

$ python hello.py
hello, __main__

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

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

另见__main__ in the python documentation(虽然它非常稀疏)

答案 1 :(得分:3)

基本上,

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

您可以使用它来保护脚本所具有的类和变量中的“执行”代码。这使您可以导入脚本并使用类和变量,而无需实际运行该脚本的主代码(如果有的话)。

另请参阅:What does if name == “main”: do?