如果 __name__ == "__main__" 是什么意思?

8132
这段代码的作用是什么?为什么要使用 if 语句?
if __name__ == "__main__":
    print("Hello, World!")

如果您要关闭一个问题,而有人应该使用这个习惯用语却没有使用,请考虑将其作为为什么在导入时Python运行我的模块,我该如何停止?的重复项进行关闭。对于那些只是没有调用任何函数或错误地期望使用名为main的函数作为自动入口点的问题,请使用当我启动Python脚本时,为什么不运行main()函数?脚本从哪里开始运行?


38
“__main__”是Python中的一个特殊变量,表示当前执行的模块是主程序。当一个Python程序被直接运行时,它的“__name__”变量被设置为“__main__”,而当它被作为一个模块导入到其他程序中时,“__name__”变量会被设置为该模块的名称。更多信息可以查看文档:https://docs.python.org/3/reference/toplevel_components.html#complete-python-programs 和 https://docs.python.org/3/reference/import.html?highlight=__name__#__name__ - Konstantin Burlachenko
30
有多少人来到这里是因为想要复制粘贴“if name == "main":”呢?:-P - Aaron John Sabu
2
如果您想编写旨在被“导入”但也可以作为独立的shell脚本运行的Python代码,这将非常有用。 由if __name__检查保护的代码仅在作为命令调用时运行,而不是在导入时运行。 如果您想使用交互式Python会话调试Python脚本,这也很有用。 您可以在交互式会话中“导入”通常作为命令运行的代码,然后手动输入代码以您喜欢的方式运行脚本中的函数/类。 - cnamejj
3
对于任何来到这里的人,[7:32] You should put this in all your Python scripts | if __name__ == '__main__': ... by YouTube channel mCoding 提供了一个很好的解释和讨论这个习语的后果。标题可能对于SO来说太过规定,但是解释很好。 - eccentricOrange
46个回答

-1

if __name__ == "__main__" 的意思是,如果你像这样正常运行 Python 文件 python foo.py,它将把特殊变量 __name__ 赋值为 "__main__"

但是,如果你像这样导入文件 "import foo",它将把 __name__ 赋值为 "foo",并且不会运行函数。


-1

if __name__ == "__main__":可以防止在导入文件时运行不想要的代码。

例如,以下是没有使用if __name__ == "__main__":test1.py文件:

# "test1.py"

def hello()
    print("Hello")

hello()

test2.py 只是导入了 test1.py

# "test2.py"

import test1 # Here


然后,当运行test2.py时,会打印出一个Hello,因为在test1.py中的不需要的代码hello()也被执行了:

python test2.py
Hello

当然,你可以在 test2.py 中调用 test1.hello()
# "test2.py"

import test1

test1.hello() # Here

然后,在运行test2时,会打印出两个Hello

python test2.py
Hello
Hello

现在,在 test1.py 中添加 if __name__ == "__main__":,并将 hello() 放在其下面:
# "test1.py"

def hello()
    print("Hello")

if __name__ == "__main__":
    hello()

这是 test2.py

# "test2.py"

import test1

test1.hello()

然后,当运行test2.py时,只会打印出一个Hello,因为if __name__ == "__main__":防止在test2.py导入test1.py时运行不需要的代码hello()

python test2.py
Hello

此外,无论 test1.py 是否有 if __name__ == "__main__":
# "test1.py"

def hello()
    print("Hello")

if __name__ == "__main__":
    hello()

# "test1.py"

def hello()
    print("Hello")

hello()

运行 test1.py 时,正确打印了一个 Hello

python test1.py
Hello

-2
当您执行模块(源文件)时,if条件会检查模块是直接调用还是从另一个源文件调用。这里的直接调用指的是未导入。
如果它是直接调用执行的,则模块名称将设置为“main”,然后将执行if块中的代码。

4
那不是已经在现有的答案中了吗? - Peter Mortensen

-3
简单来说,它是运行文件的入口点,就像C编程语言中的main函数。

15
这个回答假设提问者(或任何类似问题的用户)既熟悉C语言,也知道什么是入口点。 - arredond
8
假设在 if __name__ == "__main__" 块之前没有任何代码执行(除了没有副作用的定义),本回答也是基于这个假设的。技术上,脚本的顶部是程序的入口点。 - Charlie Harding
2
这是不正确的,很可能会导致许多初学者脚本将所有代码无用地放在此块内。 - tripleee

-3

当你 import 一些具有此条件的代码时,它将返回 False(在导入的代码内部),但对于将要运行的代码,它将返回 True


我认为这是一个非常简化的想法,因为真正的概念是,代码的这一部分(if语句内的代码)只有在这个文件是你尝试运行的脚本(python file.py)时才会被执行。但是,当你尝试从另一个脚本中导入该文件时,这部分代码会运行,但是名称会有另一个值,并且不会检查if条件。 - undefined

-9
简单的答案是,写在if name == "main":下面的代码,在另一个文件中导入时不会执行。

2
这个问题已经被其他答案覆盖了,你能否提供额外的信息来为讨论提供更多价值?谢谢! - aaossa
我认为这是一个非常简化的想法,因为真正的概念是,代码的这部分(if语句内的代码)只有在这个文件是你尝试运行的脚本(python file.py)时才会被执行。但是,当你尝试从另一个脚本中导入这个文件时,这部分代码会运行,但是__name__的值会不同,不会检查if条件。 - undefined

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