在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"保护的代码,新进程都认为是要再次运行的代码,这是子进程又一次运行,会导致意想不到到的情况发生。