前言
1、模块(Module)
1.1、定义
1.2、分类
1.3、创建模块
1.4、导入模块
1.5、模块的 __name__ 属性
2、包(Package)
2.1、包的结构
2.2、包的导入方式
2.3、相对导入(包内部使用)
3、相关函数与工具
1、importlib.reload()
2、__import__()
3、sys.path
4、详细示例
示例1:模块与包的创建
示例2:处理导入问题
5、关键注意事项
6、常见错误
最近在学习Python,将所学内容整理成文章,以便以后翻阅和复习,同时分享给大家。有问题欢迎随时指正。
一个.py文件即为一个模块,是Python代码的最小组织单位。
创建一个名为 math_tools.py
的模块:
# math_tools.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
PI = 3.14159
if __name__ == "__main__":
print("模块测试:", add(5, 3))
import module_name # 导入整个模块
from module_name import func # 导入特定函数
import module_name as alias # 设置别名
# 方式1:导入整个模块
import math_tools
print(math_tools.add(2, 3)) # 5
# 方式2:导入特定内容
from math_tools import subtract
print(subtract(5, 2)) # 3
# 方式3:别名导入
import math_tools as mt
print(mt.PI) # 3.14159
# 方式4:导入所有内容(不推荐)
from math_tools import *
print(add(10, 20))
__name__
属性当模块被直接运行时,__name__
为 "__main__"
。
当模块被导入时,__name__
为模块名。
# 直接运行模块时执行测试代码
if __name__ == "__main__":
print("模块测试通过")
包是一个包含多个模块的目录,必须包含一个__init__.py
文件(可以是空文件),用于标识当前目录是一个包。
my_package/
├── __init__.py
├── module1.py
└── subpackage/
├── __init__.py
└── module2.py
# 导入包中的模块
from my_package import module1
module1.func()
# 导入子包中的模块
from my_package.subpackage import module2
module2.func()
# 在 __init__.py 中预先导入(可选)
# my_package/__init__.py
from .module1 import func
在包内部的模块中,可以使用相对路径导入其他模块:
# module2.py(位于subpackage中)
from ..module1 import func # 从上级目录导入
1、importlib.reload()
重新加载模块(适用于调试):
import importlib
importlib.reload(math_tools)
__import__()
动态导入模块(较少使用):
module_name = "math_tools"
math_tools = __import__(module_name)
sys.path
查看模块搜索路径或添加自定义路径:
import sys
sys.path.append("/path/to/module_directory")
1、创建包 my_package
:
my_package/
├── __init__.py
├── utils.py
└── algorithms/
├── __init__.py
└── sort.py
2、编写模块 utils.py
:
# utils.py
def greet(name):
return f"Hello, {name}!"
3、在外部使用包:
from my_package.utils import greet
from my_package.algorithms.sort import bubble_sort
print(greet("Alice")) # Hello, Alice!
print(bubble_sort([3, 1, 2])) # [1, 2, 3]
1、路径问题:模块不在当前目录时,手动添加路径:
import sys
sys.path.append("/path/to/my_package")
2、循环导入:避免模块A导入模块B,同时模块B导入模块A。
解决方法:将导入语句移到函数内部或重构代码。
__init__.py
的作用:
标识目录为包。
定义 __all__
变量(如 __all__ = ["module1"]
)控制 from package import *
的行为。
执行包级别的初始化代码。
绝对导入 vs 相对导入:
绝对导入:from my_package.module import func
相对导入:from .submodule import func
(仅限包内部)
模块缓存:Python会缓存导入的模块(sys.modules
),重复导入时直接使用缓存。
ModuleNotFoundError
:检查路径或包结构。
ImportError
:确认导入语句是否正确,避免循环导入。
AttributeError
:确保模块中存在被导入的属性。