Skip to content
 

Python 中的 __name____main__ 详解

更新: 9/24/2025字数: 0 字 时长: 0 分钟

平时我们经常会看到这样的 Python 代码:

python
if __name__ == "__main__":
    main()

Python 中,__name__ 和 __main__ 是两个与模块和脚本执行相关的特殊变量。 __name__ 和 __main__ 通常用于控制代码的执行方式,尤其是在模块既可以作为独立脚本运行,也可以被其他模块导入时

一、什么是 __name__

__name__Python 中的一个内置变量,用于表示当前模块的名称。

  • 当模块被直接运行时,__name__ 的值为 "__main__"
  • 当模块被导入到其他模块时,__name__ 的值为模块本身的名称

二、基本用法

1. 直接运行模块时的行为

python
# module1.py
print(f"在 module1.py 中,__name__ 的值是: {__name__}")

if __name__ == "__main__":
    print("module1.py 被直接运行")
else:
    print("module1.py 被导入到其他模块")

直接运行 module1.py 的输出:

在 module1.py 中,__name__ 的值是: __main__
module1.py 被直接运行

如图:

2. 导入模块时的行为

python
# module2.py
import module1

print(f"在 module2.py 中,__name__ 的值是: {__name__}")

运行 module2.py 的输出:

在 module1.py 中,__name__ 的值是: module1
module1.py 被导入到其他模块
在 module2.py 中,__name__ 的值是: __main__

如图:

三、实际应用场景

1. 测试代码的隔离

python
# calculator.py
def add(a, b):
    """加法函数"""
    return a + b

def subtract(a, b):
    """减法函数"""
    return a - b

# 测试代码
if __name__ == "__main__":
    # 这些代码只有在直接运行 calculator.py 时才会执行
    print("测试计算器功能:")
    print(f"5 + 3 = {add(5, 3)}")
    print(f"10 - 4 = {subtract(10, 4)}")
else:
    print("calculator.py 被导入到其他模块")

现在将 calculator.py 导入到 module2.py 中运行输出为:

calculator.py 被导入到其他模块
在 module2.py 中,calculator.add(5, 3) 的结果是: 8
在 module2.py 中,calculator.subtract(10, 4) 的结果是: 6

如图:

2. 模块的多功能使用

python
# data_processor.py
import json

def load_data(filename):
    """加载数据文件"""
    with open(filename, 'r') as f:
        return json.load(f)

def process_data(data):
    """处理数据"""
    # 数据处理逻辑
    return processed_data

def save_data(data, filename):
    """保存数据"""
    with open(filename, 'w') as f:
        json.dump(data, f, indent=2)

# 当作为脚本运行时,执行完整的数据处理流程
if __name__ == "__main__":
    # 命令行参数处理
    import sys
    if len(sys.argv) != 3:
        print("用法: python data_processor.py 输入文件 输出文件")
        sys.exit(1)

    input_file, output_file = sys.argv[1], sys.argv[2]

    # 执行完整流程
    data = load_data(input_file)
    processed_data = process_data(data)
    save_data(processed_data, output_file)
    print("数据处理完成!")

3. 包中的 __main__.py

在包目录中创建 __main__.py 文件,可以让包像脚本一样直接运行:

my_package/
    __init__.py
    __main__.py
    module1.py
    module2.py
python
# my_package/__main__.py
from . import module1, module2

def main():
    print("运行我的包!")
    module1.some_function()
    module2.another_function()

if __name__ == "__main__":
    main()

然后可以这样运行:

bash
python -m my_package

四、高级用法

1. 调试模式检测

python
if __name__ == "__main__":
    # 开发调试模式
    DEBUG = True
    # 详细的日志输出
    print("调试模式启用")
else:
    # 生产模式
    DEBUG = False

2. 性能测试

python
import time

def expensive_operation():
    """一个耗时的操作"""
    time.sleep(1)
    return "完成"

if __name__ == "__main__":
    # 只有直接运行时才进行性能测试
    start_time = time.time()
    result = expensive_operation()
    end_time = time.time()
    print(f"操作耗时: {end_time - start_time:.2f} 秒")

我见青山多妩媚,料青山见我应如是。