理解Python中的if __name__ == “__main__”

115 阅读1分钟

在Python文件中,使用if name ==“main”语句是很常见的。然而,它可能看起来令人困惑。本文的目的是揭示它的行为,并进一步讨论在何处使用它。

Python模块是具有 .py扩展名。我们所要做的就是创建一个包含合法Python代码的文件,并使用 .py扩展名。一个模块可以导入到其他模块或直接通过命令行运行。

__name__是一个特殊的内置变量,其值为当前模块的名称。但是,如果模块是直接运行的(比如从命令行),则__name__将被设置为字符串“main"。

假设我们用以下代码创建了两个模块foo和bar:

foo.py

import bar
print("foo.__name__ set to ", __name__)

bar.py

print("bar.__name__ set to ", __name__)

执行bar,返回的是__main__

python bar.py
>>>
bar.__name__ set to __main__

执行foo,返回的bar

python foo.py
>>>
bar.__name__ set to bar
foo.__name__ set to __main__

我们可以使用以下检查来测试模块是直接运行还是导入:

if __name__ == "__main__":
    #...

为什么要这样设计

我们可能会很自然地想知道为什么它被设计成这样。有时候我们想写一个.py文件,它既可以被其他程序和/或模块作为模块使用,也可以作为主程序本身运行。利用这一点,我们使用if name=="main"块来防止代码在导入模块中执行。

第二点,这种行为对于快速开发和测试代码非常有用。它还有助于调试,允许我们可以直接运行单元测试。

除此之外,在多线程应用程序,如果没有if name=="main"保护的代码,新进程都认为是要再次运行的代码,这是子进程又一次运行,会导致意想不到到的情况发生。