Python怎样引用其他.py文件?怎样导入其他模块?
在 Python 中导入其他 .py
文件主要通过模块和包机制实现,以下是多种场景的导入方法。
基础目录结构示例
假设项目结构如下:
my_project/
├── main.py
├── utils/
│ ├── __init__.py
│ └── math_utils.py
└── models/
├── __init__.py
├── layers/
│ ├── __init__.py
│ └── activation.py
└── dptnet/
├── __init__.py
└── dpt_modules.py
1. 同级目录导入
从 math_utils.py
导入到 main.py
:
# main.py
from utils.math_utils import add_numbers # 绝对导入
class MyModel:
def __init__(self):
print(add_numbers(1, 2))
2. 子目录导入
从 dpt_modules.py
导入到 main.py
:
# main.py
from models.dptnet.dpt_modules import DPTBlock # 绝对导入
model = DPTBlock()
3. 多层相对路径导入
(1) 使用相对导入(包内部使用)
在 activation.py
中导入上级目录的模块:
# models/layers/activation.py
from .. import ModelBase # .. 表示上一级目录(models)
from ...utils.math_utils import add_numbers # ... 表示上两级目录(my_project)
(2) 多层子包相对导入
在 dpt_modules.py
中导入兄弟目录的模块:
# models/dptnet/dpt_modules.py
from ..layers.activation import ReLU # 从 models/layers 导入
4. 使用 __init__.py
简化导入
在包的 __init__.py
中预先声明导出内容:
# models/dptnet/__init__.py
from .dpt_modules import DPTBlock, DPTEncoder # 相对导入
现在可以直接从包名导入:
# main.py
from models.dptnet import DPTBlock # 更简洁的导入方式
5. 处理特殊场景
(1) 动态添加系统路径(不推荐但实用)
import sys
sys.path.append("/path/to/my_project") # 添加项目根目录到系统路径
from models.dptnet import DPTBlock
(2) 使用 importlib
动态导入
import importlib
module = importlib.import_module("models.dptnet.dpt_modules")
DPTBlock = getattr(module, "DPTBlock")