Python中if __name__ == "__main__"的作用解析

Python中if name == "main"的作用解析

技术背景

在Python编程中,if __name__ == "__main__": 是一个常见的代码结构。Python是一种脚本语言,代码执行没有像C、Java等语言那样有固定的main函数作为程序入口。当Python解释器读取一个源文件时,会设置一些特殊变量并执行文件中的所有代码。__name__ 就是其中一个特殊变量,它的值取决于模块的使用方式,而 if __name__ == "__main__": 可以控制代码在不同场景下的执行逻辑。

实现步骤

1. 理解__name__变量

  • 当模块作为主程序运行时,如 python foo.py,Python解释器会将 __name__ 变量赋值为 "__main__"
  • 当模块被其他模块导入时,如 import foo__name__ 变量会被赋值为模块的名称,即 "foo"

2. 编写示例代码

以下是一个简单的示例代码 foo.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print("before import")
import math

print("before function_a")
def function_a():
print("Function A")

print("before function_b")
def function_b():
print("Function B {}".format(math.sqrt(100)))

print("before __name__ guard")
if __name__ == '__main__':
function_a()
function_b()
print("after __name__ guard")

3. 不同运行方式下的结果

  • 作为主程序运行
    执行 python foo.py,输出结果如下:
1
2
3
4
5
6
7
before import
before function_a
before function_b
before __name__ guard
Function A
Function B 10.0
after __name__ guard

此时 __name__"__main__"if 语句块内的代码会被执行。

  • 被其他模块导入
    假设存在另一个文件 main.py,内容如下:
1
2
3
4
import foo

if __name__ == '__main__':
print('Hello from main.py')

执行 python main.py,输出结果如下:

1
2
3
4
5
6
before import
before function_a
before function_b
before __name__ guard
after __name__ guard
Hello from main.py

foo.py 被导入时,__name__"foo"if 语句块内的代码不会被执行。

核心代码

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# file one.py
def func():
print("func() in one.py")

print("top-level in one.py")

if __name__ == "__main__":
print("one.py is being run directly")
else:
print("one.py is being imported into another module")

# file two.py
import one

print("top-level in two.py")
one.func()

if __name__ == "__main__":
print("two.py is being run directly")
else:
print("two.py is being imported into another module")

模块化示例

1
2
3
4
5
6
7
8
9
10
11
12
def fibn(n: int) -> int:
a, b = 0, 1
while b < n:
a, b = b, a+b
return b

def main() -> None:
n = int(input('Write a number: '))
print('Fibonacci number %i: %i' % (n, fibn(n)))

if __name__ == "__main__":
main()

最佳实践

开发和测试代码

当编写一个既可以作为脚本运行,又可以作为模块被其他脚本导入的Python文件时,使用 if __name__ == "__main__": 可以方便地进行测试。例如:

1
2
3
4
5
6
def do_important():
"""This function does something very important"""
pass

if __name__ == "__main__":
do_important()

这样,在开发和测试时可以直接运行该脚本,而当被其他模块导入时,不会执行测试代码。

代码模块化

将主要的业务逻辑封装在一个 main 函数中,然后在 if __name__ == "__main__": 中调用 main 函数,提高代码的可维护性和可复用性。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def setup():
pass

def do_important():
pass

def do_even_more_important(foo):
pass

def do_super_important(baz):
pass

def teardown():
pass

def main():
"""business logic for when running this module as the primary one!"""
setup()
foo = do_important()
bar = do_even_more_important(foo)
for baz in bar:
do_super_important(baz)
teardown()

if __name__ == '__main__':
main()

常见问题

可以有多个 __name__ 检查块吗?

可以,但这种做法比较奇怪,不建议这样做。虽然Python语言不会阻止你,但会降低代码的可读性和可维护性。

忘记使用 if __name__ == "__main__": 会有什么问题?

如果在脚本中省略了 if __name__ == "__main__": 保护,当该脚本被其他脚本导入时,会在导入时立即执行,可能会导致意外的结果,例如使用了导入脚本的命令行参数等。

修改 __name__ 变量的值会怎样?

虽然可以修改 __name__ 变量的值,但这是非常不推荐的做法。__name__ 是Python自动设置的特殊变量,修改它会破坏代码的逻辑,导致代码难以理解和维护。


Python中if __name__ == "__main__"的作用解析
https://119291.xyz/posts/2025-05-07.python-if-name-main-explanation/
作者
ww
发布于
2025年5月7日
许可协议