当python文件被直接运行时,__name__值为'__main__',被导入时为模块名;该机制用于区分脚本执行与模块导入,避免导入时意外执行主逻辑,确保代码可复用、可测试、结构清晰。

当 Python 文件被直接运行时,__name__ 的值是 '__main__';被导入时,它的值是模块名(不含 .py)。这个特性常用于区分“作为脚本执行”还是“作为模块被导入”,从而控制代码是否运行。
为什么需要判断 __name__ == '__main__'
避免模块被导入时意外执行主逻辑。比如一个文件既想被别人 import 复用函数,又想自己运行做测试或启动服务——不加判断,一导入就执行 main 逻辑,会出错或干扰调用方。
- 写工具函数的模块,通常只希望导出函数,不希望一导入就打印菜单或启动服务器
- 单元测试常放在
if __name__ == '__main__':块里,保证只在直接运行时触发 - 命令行脚本常用它来组织入口,保持结构清晰、可测试、可复用
__name__ 是怎么被赋值的
Python 解释器在加载文件时自动设置该变量:
- 直接执行:
python script.py→__name__被设为'__main__' - 被导入:
import script→__name__被设为'script' - 包内导入(如
from mypkg import mod)→mod.__name__是'mypkg.mod'
它不是魔法常量,而是解释器在模块初始化阶段写入的普通字符串属性,可在代码中读取甚至修改(但不建议)。
立即学习“Python免费学习笔记(深入)”;
常见写法与注意事项
标准写法是:
if __name__ == '__main__':main() # 或其他启动逻辑
- 必须用双等号
==,不是赋值;写成=会报语法错误 -
'__main__'两侧是两个下划线,拼写错误(如少一个、多一个)会导致永远不成立 - 该判断块通常放在文件末尾,但不是强制要求;只要逻辑位置合理即可
- 支持嵌套和组合:比如在函数里动态判断,或配合
sys.argv做命令行分发
实际例子:一个可导入又可运行的模块
假设 math_utils.py:
return a + b
def main():
print("Running as script:", add(2, 3))
if __name__ == '__main__':
main()
- 执行
python math_utils.py→ 输出Running as script: 5 - 在另一文件中
import math_utils→ 不输出,但可调用math_utils.add(10, 20)









