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

if __name__ == "__main__" 用于区分脚本直接运行和被 import 两种情况:只有直接运行时块内代码才执行。本文解释 __name__ 变量与标准写法。

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

核心作用:这个判断块里的代码只在文件被当作脚本直接运行时执行;当文件被其他模块 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 必须:Windows/macOS 上 multiprocessing 要求入口代码在 if __name__ == '__main__': 保护之下,否则子进程会递归启动导致报错。

标准骨架

import argparse

def main():
    parser = argparse.ArgumentParser()
    # ...解析参数、调用业务逻辑...

if __name__ == '__main__':
    main()

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

常见问题(FAQ)

Q:写成 if __name__ == "main"(不带双下划线)会怎样?
A:永远不会为真——__name__ 的值是 "__main__" 不是 "main",判断块永远不执行。

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

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

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台