在Python中,`if name == "__main__"` 是什么意思?

16

可能是重复内容:
什么是<if name==“main”:>?

我已经写了相当长时间的Python脚本,并在需要时学习更多关于Python的知识。当阅读其他人的代码时,我经常遇到if name == "__main__":结构。

它有什么作用?


1
哦,我明白了... if __name__="__main__": 检查脚本是独立的还是模块。 - Adobe
1
如果你是复制粘贴的话或者为了避免混淆,请注意前面注释中的拼写错误:if __name__=="__main__": - alberto
2个回答

29
这使您可以将同一文件既用作库(通过导入它),又用作应用程序的起点。
例如,考虑以下文件:
# 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”)。
通常,这种结构用于向代码添加单元测试。这样,当您编写库时,可以将测试代码嵌入到文件中,而不必担心在正常使用库时会执行它。当您想要测试库时,您不需要任何框架,因为您可以像运行程序一样运行库。
另请参见Python文档中的 __main__ (尽管非常简略)。

4

基本上,

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

您可以使用这个方法来保护脚本中的类和变量不受"执行"代码的影响。这使得您可以导入一个脚本并使用其中的类和变量,而不必运行该脚本的主要代码(如果有的话)。

另请参阅:if name == "main":做什么?


1
奖励小知识:如果您导入一个名为“__main__”的模块,您会在__name__中找到什么? - Agrajag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接