深入解析Python中if __name__ == '__main__'的作用与原理

Elena
Elena
发布时间:2026-10-12| 5人浏览过
原创

本文详细解析Python中if __name__ == '__main__'的核心机制。通过对比编译型语言与脚本语言的执行差异,阐明__name__变量在直接运行与模块导入时的不同取值。结合具体代码场景,说明如何利用该结构区分测试代码与业务逻辑,并展示其在包路径显示中的应用,帮助开发者规范Python代码结构。

在学习Python编程时,经常会遇到形如以下的代码结构:

if __name__ == "__main__":
    print("Hello World!")

1. 程序入口

对于大多数编程语言而言,程序都需要一个明确的入口点。例如C语言、C++,以及完全面向对象的Java、C#等语言。接触过这些语言的开发者对“程序入口”概念应当十分熟悉:C和C++必须定义一个main 函数作为程序起点,执行流程从main 函数开始;同样,Java 和 C#语言也必须包含一个带有Main方法的主类作为程序入口。

而Python 的情况则有所不同。Python属于脚本语言,不同于编译型语言先将源码编译为二进制文件再执行的方式,它是动态地逐行解释执行。因此,Python脚本从第一行代码开始运行,并没有统一的强制入口点。

if __name__ == “__main__”: 本质上是一个条件判断语句,但它并非普通的if判断。当.py文件被直接运行时,,__name__ 的值等于'__main__',此时会执行if语句块内的代码;否则不执行。当然,你也可以将代码改写为如下形式:

if __name__ == "__main__":
    print("Hello World!")
else:
    print("Hello Mars!")


2. __name__是什么?

__name__是Python语言内置的一个特殊变量,它是每个Python 模块必须具备的属性,但其具体值取决于代码的执行方式。

当你直接执行一个脚本文件时,该脚本的 __name__变量值等于 ‘__main__' 当该脚本被其他程序导入时,,__name__ 变量的值则等于脚本文件本身的名称。

场景1:直接运行脚本

假设我们有一个名为nameScript.py,的脚本文件,其代码如下:

def myFunction():
    print('The value of __name__ is ' + __name__)


def main():
    myFunction()


if __name__ == '__main__':
    main()

直接执行该文件后的运行流程如下:

在所有其他代码执行之前,,__name__变量就被设置为 ‘__main__'。随后,通过执行def语句,函数main()和myFunction() 的定义被载入内存。接着,由于if语句后的表达式结果为真(true),函数main()被调用。而main() 函数内部又调用了myFunction(),,最终打印出变量的值'__main__'。

场景2:从其他脚本导入

如果你需要在其他脚本中复用这个myFunction() 函数,比如在 importingScript.py 中,我们可以将 nameScript.py 作为一个模块导入。

importingScript.py 文件的内容如下:

import nameScript as ns

ns.myFunction()

此时,系统中存在两个不同的作用域:一个是 importingScript 的作用域,另一个是 nameScript 的作用域:

在 importingScript.py 中,,__name__ 变量被设置为 ‘__main__'。当导入nameScript 模块时,Python 解释器会在本地目录和环境变量PATH指定的路径中查找对应名称的.py文件。找到文件后,解释器会执行导入文件中的代码。

但这一次,在导入过程中,该模块自身的 __name__ 变量被设置为‘nameScript'。接下来,函数main() 和myFunction()的定义被载入。然而,由于if语句后的表达式结果为假(false),main() 函数并未被调用。

导入完成后,执行流程回到importingScript.py 中。此时,nameScript模块中的函数定义已导入到当前作用域,我们可以通过 ns.myFunction() 的方式调用模块中的函数。该函数返回的是模块内变量的值‘nameScript'。

如果你尝试在 importingScript 中打印__name__ 变量的值,当你直接执行 importingScript 时,它也会输出‘__main__'。原因在于,该变量存在于 importingScript 的作用域中。

3. __name__可以显示包路径

我们可以建立如下目录结构:

a
├── b
│   ├── c.py
│   └── __init__.py
└── __init__.py
d.py


c.py文件中的代码:

print(__name__)


d.py文件中的代码:

from a.b import c


运行d.py文件,输出结果为:

a.b.c

此时,a.py文件的__name__属性变为a.b.c,完整反映了它所在的包路径信息。

5. 测试模块里函数

由于脚本被引入时,其内部代码会被执行,因此我们在每个脚本中通常都会编写一段if __name__ == '__main__': 代码。如果你希望某些代码仅在脚本被直接执行时才运行,就将这些代码放入if语句块中。最常见的情形便是编写测试代码:

def safe_division(a, b):
    if b == 0:
        return None

    return a/b

if __name__ == '__main__':
    print(safe_division(10, 5) == 2)
    print(safe_division(10, 0) == None)

在编写完一个函数后,通常需要编写一些测试代码。我们希望这些测试代码在模块被导入时不执行,仅在主程序主动运行测试时才执行。

到此,关于Python中if __name__ == ‘__main__的详情介绍完毕。更多相关Python中if __name__ == ‘__main__'的内容,请搜索本站历史文章或继续浏览后续相关文章。希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。