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

16 投票
2 回答
44077 浏览
提问于 2025-04-17 06:50

可能重复的问题:
<if name==“main”:> 是干什么的?

我已经写了很长时间的Python脚本了,随着需要我也在不断学习Python。当我阅读别人的代码时,经常会看到 if name == "__main__": 这个结构。

这个结构有什么用呢?

2 个回答

4

基本上,

这里有一个区别,就是“主”脚本文件和其他通过导入或其他方式引用的外部文件。如果这个脚本是“主”脚本,那么一个特殊的变量 __name__ 的值就会是 "__main__"

你可以利用这个特性来保护脚本中的“执行”代码,避免它和类、变量混在一起。这样一来,你就可以导入这个脚本,使用里面的类和变量,而不需要实际运行这个脚本的主代码(如果有的话)。

另外,你可以查看这个链接了解更多:if name == “main”: 是干什么的?

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)。

通常,这种结构用来给你的代码添加单元测试。这样,当你写一个库的时候,可以把测试代码直接放在文件里,而不用担心在正常使用库的时候会被执行。当你想测试这个库时,不需要任何框架,因为你可以直接像运行程序一样运行这个库。

更多信息可以查看 __main__ 在 Python 文档中的介绍(不过内容比较少)。

撰写回答