模块基础
本教程共 70 篇 · 第 28 篇 · 更新于 2026-07-22 · 约 4 分钟阅读
28. 模块基础
本节目标:理解模块的概念,掌握 import 的各种写法,学会组织自己的代码文件。
什么是模块
模块就是一个 .py 文件。你写的每个 Python 脚本,本质上都是一个模块。
把相关的函数、类、变量放到一个文件里,其他地方通过 import 引入,就能复用。这是代码组织的基本单位。
Note模块名就是文件名去掉
.py。比如math_tools.py的模块名是math_tools。
import 的几种方式
假设有个 utils.py 文件:
# utils.py
PI = 3.14159
def add(a, b):
return a + b
def greet(name):
print(f"Hello, {name}!")
导入整个模块
import utils
print(utils.PI)
print(utils.add(2, 3))
utils.greet("Alice")
这种方式最清晰,一眼能看出某个函数来自哪个模块。
从模块导入指定内容
from utils import add, greet
print(add(2, 3))
greet("Alice")
Warning如果导入的名字和当前文件里的变量重名,会发生覆盖。用这种方式时要留心命名冲突。
导入所有内容(不推荐)
from utils import *
这会把模块里所有不以下划线开头的名字都导入当前命名空间。名字冲突的风险很大,而且读者不知道某个名字来自哪里。尽量避免。
起别名
import numpy as np
from utils import greet as say_hello
别名在长模块名或需要避免冲突时很有用。np 几乎成了 NumPy 的行业标准别名。
模块搜索路径
Python 按这个顺序找模块:
- 当前目录
PYTHONPATH环境变量指定的目录- Python 安装目录下的标准库
.pth文件里指定的路径
可以用 sys.path 查看:
import sys
print(sys.path)
Tip不要把自己的文件名起成和标准库一样,比如
random.py、json.py。Python 会优先找到当前目录下的文件,导致标准库用不了。
name 与 main
每个模块都有一个 __name__ 属性:
- 被直接运行时,
__name__的值是'__main__' - 被 import 导入时,
__name__的值是模块名
利用这个特性,可以写「既当模块又当脚本」的文件:
# calculator.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
# 以下代码只在直接运行此文件时执行
if __name__ == "__main__":
print("测试 add:", add(2, 3))
print("测试 subtract:", subtract(5, 2))
直接运行 python calculator.py,会执行测试代码。如果 import calculator,测试代码不会运行。
Note
if __name__ == "__main__":是 Python 的惯用写法。所有「直接运行时才执行」的代码都放这里面,比如单元测试、命令行参数解析等。
模块里的可执行代码
模块被导入时,文件里的代码会从上到下执行一遍。所以模块里经常放初始化逻辑:
# config.py
import os
# 模块被导入时,自动读取环境变量
API_KEY = os.getenv("API_KEY")
DEBUG = os.getenv("DEBUG", "false").lower() == "true"
但注意:一个模块在一个程序生命周期内只会被导入一次。多次 import 不会重复执行。
dir() 查看模块内容
import math
print(dir(math)) # 列出 math 模块的所有公开名字
带下划线的是内部成员,一般不用管。
来源:参考了 runoob「Python3 模块」、liaoxuefeng「模块」等,改写后所得。