Python脚本中的__main__中的作用
Python脚本中的__main__中的作用
在 Python 中,if __name__ == "__main__": 是一个常见的结构,主要用于控制代码的执行方式,确保代码只有在直接运行当前文件时才会执行,而不会在被其他模块导入时执行。
什么是 __name__?
📌 在 Python 中,每个模块(文件)在运行时都会有一个特殊的变量 __name__,它的值取决于模块是直接执行还是被导入。
✅当 Python 直接运行文件时,__name__ 的值是 "__main__"。
✅当 Python 文件被作为模块导入时,__name__ 取的是文件的模块名(不带 .py)。
🔹 示例:检查 __name__ 的值
1 | |
如果直接运行 my_module.py:
1 | |
输出:
1 | |
如果这个文件被其他 Python 文件 import:
1 | |
输出:
1 | |
为什么要用 if __name__ == "__main__":?
📌 在 Python 中,我们通常使用 if __name__ == "__main__": 来避免导入时执行不必要的代码。
🔹 示例:没有 if __name__ == "__main__" 的问题
1 | |
如果直接运行:
1 | |
输出:
1 | |
但如果被 import:
1 | |
仍然会输出:
1 | |
⚠️ 问题:
⛔️意外执行:我们只是想导入 greet() 函数,但文件里的所有代码都被执行了!
⛔️可能导致错误:如果 my_script.py 里包含数据库操作或 IO 操作,会被意外触发。
正确使用 if __name__ == "__main__":
🔹 继续上个例子,添加 if __name__ == "__main__":
1 | |
✅ 改进后
1 | |
输出(没有不必要的执行):
1 | |
greet() 不会执行,除非显式调用 my_script.greet()。
企业实战案例
📌 在实际项目中,if __name__ == "__main__": 主要用于:
✅ 编写可复用的模块
✅ 防止导入时的副作用
✅ 让 Python 脚本既能独立运行,又能作为模块使用
🔹 案例 1:数据库初始化
1 | |
🟢 好处:
🟢 其他模块可以 import database 而不会初始化数据库。
🟢 只有直接运行 python database.py 时才会初始化数据库。
🔹 案例 2:命令行工具
1 | |
直接运行:
1 | |
输出:
1 | |
⚠️ 导入时不会自动运行 main()。
🔹 案例 3:Web 服务器
1 | |
✔️ 这样就不会在 import app 时启动 Flask 服务器!
if __name__ == "__main__": VS __main__.py
📌 有时,我们也可以使用 __main__.py 作为项目入口。
🔹 示例:Python 包执行
1 | |
🔴 如果 my_package/__main__.py 存在,它就会执行,效果类似 if __name__ == "__main__":。
总结
| 场景 | if __name__ == "__main__": 的作用 |
|---|---|
| 直接运行 Python 文件 | 代码会执行 |
| Python 文件被导入 | 代码不会执行 |
| 适用于脚本工具 | 让 Python 文件既可独立运行,又可导入 |
| 适用于 Flask、Django | 避免 import 时启动服务器 |
| 适用于数据库操作 | 避免 import 时创建连接 |
✅ 建议始终使用 if __name__ == "__main__":,以确保 Python 文件可复用且无副作用。🚀