if __name__ == '__main__': 是基于模块加载机制的运行时判断,决定代码作为库被导入时仅定义、直接运行时才执行主逻辑,避免意外副作用。

当你在 Python 文件中看到 if __name__ == '__main__':,它不是语法糖,也不是装饰器,而是一个靠模块加载机制实现的运行时判断——核心在于每个模块都有一个 __name__ 属性,它的值取决于模块「如何被使用」。
模块的 __name__ 值由加载方式决定
Python 在导入或执行一个 .py 文件时,会自动给该文件对应的模块对象设置 __name__ 属性:
- 如果这个文件是被其他模块通过
import加载的(比如import mymodule),那么它的__name__就是模块名,如'mymodule'; - 如果这个文件是直接运行的(比如
python script.py),解释器会把它当作顶层脚本,此时它的__name__被设为字符串'__main__'。
为什么需要这个判断?
它解决了「一份代码,两种角色」的问题:
- 作为库:被 import 时,只应暴露函数、类等定义,不该立即执行测试或主逻辑;
- 作为脚本:直接运行时,才需要启动主流程,比如调用
main()或跑单元测试。
没有它,每次导入模块都可能意外触发副作用(例如打印日志、连接数据库、启动服务),导致不可控行为。
立即学习“Python免费学习笔记(深入)”;
实际写法建议
推荐把可执行逻辑封装成函数,再在 if __name__ == '__main__': 下调用:
def main():
print("程序开始运行")
if __name__ == '__main__':
main()
这样既保持模块可被安全导入,又支持命令行直接运行。如果你的文件同时承担库和脚本职责(比如工具脚本),这种结构就是标准做法。
一个小陷阱:__name__ 不可手动修改
虽然 __name__ 是个普通属性,但手动赋值(如 __name__ = 'abc')不会影响模块身份判断,也不会让 if __name__ == '__main__' 成立——因为解释器只在加载阶段一次性设置它,后续修改无效。别试图绕过机制,按规范用就行。










