if __name__ == "__main__" 在 Python 里有什么作用?
if __name__ == "__main__" 用于区分脚本直接运行和被 import 两种情况:作为主程序入口(直接运行文件或 python -m)时块内代码才执行。本文解释 __name__ 变量与标准写法。
核心作用:这个判断块里的代码在模块作为主程序入口运行时执行(直接运行文件或使用 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,只会定义函数,判断块被跳过。
什么时候需要它
- 防止副作用:把命令行解析、耗时初始化放进判断块,避免别人 import 你的模块时意外执行。
- 模块自测:在文件底部放几行临时测试代码,开发时直接跑,发布后被 import 也不会触发。
- 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()。