if __name__ == "__main__" 在 Python 里有什么作用?

if __name__ == "__main__" 用于区分脚本直接运行和被 import 两种情况:作为主程序入口(直接运行文件或 python -m)时块内代码才执行。本文解释 __name__ 变量与标准写法。

最佳实践
if __name__ == "__main__" 在 Python 里有什么作用?封面

核心作用:这个判断块里的代码在模块作为主程序入口运行时执行(直接运行文件或使用 python -m);当文件被其他模块 import 时不会执行。它是 Python 区分"主程序入口"与"被引用模块"的标准写法。

原理:name 变量

每个 Python 模块都有内置变量 __name__:

  • 直接运行 python mylib.py 时,__name__ 的值是字符串 "__main__"
  • 被 import mylib 引入时,__name__ 的值是模块名 "mylib"

实例对比

# mylib.py
def say_hi():
    print('hi from the function')

if __name__ == '__main__':
    print('作为脚本直接运行')
    say_hi()

直接运行 python mylib.py,两行都会输出;而在另一个文件里 import mylib,只会定义函数,判断块被跳过。

什么时候需要它

  1. 防止副作用:把命令行解析、耗时初始化放进判断块,避免别人 import 你的模块时意外执行。
  2. 模块自测:在文件底部放几行临时测试代码,开发时直接跑,发布后被 import 也不会触发。
  3. multiprocessing 入口保护:spawn/forkserver 等启动方式要求创建子进程的入口代码放在 if __name__ == '__main__': 保护之下,否则导入主模块时可能递归创建进程;要求取决于启动方式,不只由 Windows/macOS 判断。

标准骨架

import argparse

def main(argv=None):
    parser = argparse.ArgumentParser()
    args = parser.parse_args(argv)
    # ...调用业务逻辑...
    return 0

if __name__ == '__main__':
    raise SystemExit(main())

把真正的逻辑收进 main() 函数,判断块里只留一行调用,是最干净、最易测试的结构。

常见问题(FAQ)

Q:写成 if __name__ == "main"(不带双下划线)会怎样?
A:作为主程序入口时不会匹配;但名为 main 的模块被 import main 导入时 name 可以是 main,因此不能说永远不为真。

Q:包里的 __init__.py 需要写这个吗?
A:一般不需要。它常用于可执行脚本或 python -m 包名 场景的 __main__.py。

Q:能对判断块里的代码写单元测试吗?
A:直接测不方便,这正是推荐把逻辑放进 main() 的原因——测试时直接 import 并调用 main()。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台