if __name__ == "__main__" 在 Python 里有什么作用?
if __name__ == "__main__" 用于区分脚本直接运行和被 import 两种情况:只有直接运行时块内代码才执行。本文解释 __name__ 变量与标准写法。
核心作用:这个判断块里的代码只在文件被当作脚本直接运行时执行;当文件被其他模块 import 时不会执行。它是 Python 区分"主程序入口"与"被引用模块"的标准写法。
原理:name 变量
每个 Python 模块都有内置变量 __name__:
- 直接运行
python mylib.py时,__name__的值是字符串"__main__" - 被
import mylib引入时,__name__的值是模块名"mylib"
实例对比
# mylib.py
def say_hi():
print('hi from the function')
if __name__ == '__main__':
print('作为脚本直接运行')
say_hi()
直接运行 python mylib.py,两行都会输出;而在另一个文件里 import mylib,只会定义函数,判断块被跳过。
什么时候需要它
- 防止副作用:把命令行解析、耗时初始化放进判断块,避免别人 import 你的模块时意外执行。
- 模块自测:在文件底部放几行临时测试代码,开发时直接跑,发布后被 import 也不会触发。
- multiprocessing 必须:Windows/macOS 上
multiprocessing要求入口代码在if __name__ == '__main__':保护之下,否则子进程会递归启动导致报错。
标准骨架
import argparse
def main():
parser = argparse.ArgumentParser()
# ...解析参数、调用业务逻辑...
if __name__ == '__main__':
main()
把真正的逻辑收进 main() 函数,判断块里只留一行调用,是最干净、最易测试的结构。
常见问题(FAQ)
Q:写成 if __name__ == "main"(不带双下划线)会怎样?
A:永远不会为真——__name__ 的值是 "__main__" 不是 "main",判断块永远不执行。
Q:包里的 __init__.py 需要写这个吗?
A:一般不需要。它常用于可执行脚本或 python -m 包名 场景的 __main__.py。
Q:能对判断块里的代码写单元测试吗?
A:直接测不方便,这正是推荐把逻辑放进 main() 的原因——测试时直接 import 并调用 main()。