if __name__ == "__main__": 是控制模块作为脚本运行或被导入时行为的关键机制,确保测试、入口逻辑和副作用代码仅在直接执行时触发,提升复用性与安全性。

当一个 Python 文件既可能被其他模块导入,又可能作为脚本直接运行时,if __name__ == "__main__": 就是控制“谁来执行、何时执行”的关键开关。它不是语法强制要求,但它是组织代码结构、避免意外执行、提升模块复用性的通用实践。
理解 __name__ 的两种取值
每个 Python 模块都有一个内置变量 __name__,它的值取决于模块的使用方式:
- 如果该文件被直接运行(例如执行
python my_module.py),__name__的值自动设为字符串"__main__"; - 如果该文件被其他模块通过
import my_module导入,__name__的值就是模块名(如"my_module")。
这个差异让程序能“感知”自己当前的角色——是主程序,还是被调用的工具库。
只在直接运行时执行测试或启动逻辑
把调试代码、示例调用、命令行入口等写在 if __name__ == "__main__": 块里,就能确保它们不会在被导入时触发。例如:
def greet(name):
return f"Hello, {name}!"
def main():
print(greet("World"))
if __name__ == "__main__":
main()
这样,别人 import my_module 时,只会加载函数定义,不会自动打印问候语;而单独运行该文件时,main() 才会被调用。
支持命令行参数和更清晰的入口设计
配合 argparse 或 sys.argv,可以把脚本功能做得更实用:
import sys
def run_task(task_id):
print(f"Running task {task_id}")
if __name__ == "__main__":
if len(sys.argv) > 1:
run_task(sys.argv[1])
else:
print("Usage: python my_module.py <task_id>")</task_id>
也可以封装成标准的 main() 函数再调用,便于后续集成到 CLI 工具或测试中。
避免副作用,提升模块安全性
没有这个保护,模块顶层的任意语句(比如打开文件、发起网络请求、修改全局状态)都会在导入时立即执行,容易引发错误或性能问题。例如:
- 数据库连接初始化代码放在
if __name__ == "__main__":外面 → 导入就连接,浪费资源; - 单元测试用例写在模块顶层 → 一导入就跑测试,干扰正常使用;
- 配置读取或日志设置写在外部 → 可能被重复执行或覆盖。
把这些逻辑收进 if __name__ == "__main__": 或独立函数中,模块就变得更“干净”、更可控。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











