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
文件可复用且无副作用。🚀