Python 中的 __name__

2025年1月13日 | 阅读 5 分钟

Python 中当前正在执行的 Python 脚本或模块的名称存储在 Python 的 `__name__` 特殊变量中。Python 3.0 引入了 `__name__` 变量,而 Python 2.x 版本中没有该变量。当当前 Python 脚本或模块正在运行时,其值 `__main__` 会被赋给 `__name__` 变量。

`__name__` 是什么意思?

Python 有一个内置变量 `__name__`,用于存储当前正在执行的脚本或模块的名称。除非当前模块正在运行,否则脚本或模块的名称会存储在 `__name__` 变量中,在这种情况下,`__main__` 会被赋给它。

因此,当一个 Python 脚本被导入到另一个 Python 脚本中时,它的 `__name__` 变量的值应该是 `__main__`。否则,就会显示模块的名称。

示例

为了更好地理解这一点,让我们举一个例子。创建一个 **名为 testing.py 的 Python 脚本,** 并将以下代码附加到其中

输出

Value of the __name__ :  __main__

说明

如输出“Value of the name: main”所示,脚本正在立即作为主程序运行。在 Python 中,当脚本被直接执行时,该脚本的 `__name__` 变量的值会自动设置为 `'__main__'`。此输出确认该脚本是直接运行的,而不是作为模块导入到另一个脚本中。

现在,让我们创建另一个名为 **mains.py 的 Python 脚本,** 并将前面的脚本导入其中。

示例

输出

Value of the __name__ : testing

说明

当使用 `import testing` 将 `testing.py` 脚本导入到另一个 Python 脚本中时,将运行 `testing. anything()` 方法。在这种情况下,模块的名称(在此例中为“testing”)将被设置为 `testing.py` 中 `__name__` 变量的值,而不是“`__main__`”。因此,`testing. anything()` 的输出为“Value of the `__name__`: testing.”。这说明直接运行脚本与将其作为模块导入对 `__name__` 变量的值有何影响。

使用 `if name == main` 条件

我们使用 **if 语句** 和条件 **`__name__ == __main__`** 来声明 **某些 Python 代码** 应该 **仅在直接运行脚本时执行**。

示例

在这种情况下,使用字符串 `__main__` 来确定当前模块或脚本是否能够独立运行。为了向 Python 解释器指示 `__name__` 变量中的一个关键字是保留的或特殊的,该术语的两侧都有两个下划线。

Python 中 `name` 的代码示例

如前所述,当我们运行一个代码文件时,代码会被直接执行,甚至没有导入到另一个文件中,因此 `__name__` 变量的值会变为 `__main__`。

输出

It is a function in the ScriptP1.
Called from the ScriptP1.

说明

如输出“It is a function in the ScriptP1.”后跟“Called from the ScriptP1.”所示,脚本 `ScriptP1` 中定义的 `anything()` 函数正在直接作为主程序运行。当脚本直接在 Python 中运行时,`__name__` 变量被设置为 `'__main__'`;因此,条件 `if __name__=='__main__':` 求值为 True,调用 `anything()` 函数。后面的 print 语句验证了脚本确实是直接运行的。

现在,让我们创建一个名为 `ScriptP2.py` 的新 Python 脚本文件,将 `ScriptP1.py` 导入其中,然后尝试调用 `ScriptP1` 的 `anything()` 方法。

代码: 这里提供了 **ScriptP2.py** 代码

输出

ScriptP1 is imported into another file.
It is a function in the ScriptP1.
Called from the ScriptP2.

说明

提供的 Python 脚本展示了如何将“ScriptP1”模块导入到当前脚本中。方法“anything()”存在于“ScriptP1”中,并在主脚本中被调用。调用此函数,并且脚本输出“Called from the ScriptP2.”以指示函数调用已完成。此事件流程表明“ScriptP1”中定义的方法在当前运行的脚本的上下文中是可访问的并且已成功执行,该脚本被标识为“ScriptP2”。

当 `ScriptP2` 中的 `ScriptP1` 导入语句运行时,`__name__` 变量的值为 `ScriptP1`(模块名称);但是,由于 `ScriptP2` 是第一个运行的脚本,所以它现在的值将是 `__main__`。

打印 `__name__` 的值

让我们在执行的每个阶段打印 `__name__` 变量的值,以帮助您更好地理解它。

示例: 以下是 ScriptP1.py Python 脚本的源代码

输出

Value or the variable __name__ : __main__

说明

提供的 Python 代码示例输出变量 `__name__` 的值,当脚本直接运行时,该值为“main”。这意味着当脚本直接启动时,将运行 `if __name__ == '__main__':` 条件后面的代码块,而不是将其作为模块导入到另一个脚本中。这种行为通常用于区分将脚本作为主应用程序运行和将其作为模块导入到另一个脚本中。

示例 2: 这是 ScriptP2.py 脚本的源代码

输出

Value or the variable __name__ : __main__

说明

提供的 Python 脚本使用 import 语句导入文件“ScriptP1.py”。当它被执行时,将打印“main”作为变量 `__name__` 的值。这意味着该脚本被直接作为主应用程序执行,而不是被导入到另一个脚本作为模块。在执行 Python 脚本时,这是典型行为;脚本的执行上下文反映在 `__name__` 变量中。

摘要

在大多数编程语言中,`main` 方法或函数通常用作执行任何程序的入口点。但 Python 呢?Python 程序(脚本)的执行通常从第 0 行或程序的缩进级别 0 开始。然而,`__name__` 变量的创建发生在 Python 程序运行之前。此变量可用于替换 Python 中的 `main` 方法。