1. 模块和包是什么? #

2. 导入的常用写法 #

# 导入整个 os 模块,使用时写 os.path.join
import os
# 只导入 datetime 类
from datetime import datetime
# 导入 pandas 并起别名 pd(社区约定)
import pandas as pd
写法 说明
import math 清晰,适合用多个成员
from math import sqrt 只用少数几个时
import numpy as np 长模块名缩短
from pkg import * 不推荐,易冲突、难读

3. if __name__ == "__main__" #

# scripts/export_users.py
# 定义主函数
def main():
    print("export users")

# 仅在被直接运行时执行,被 import 时不执行
if __name__ == "__main__":
    main()

4. 包的结构 #

myproject/
├── manage.py              # 或 app.py 入口
├── requirements.txt
└── myapp/                 # 包
    ├── __init__.py        # 可为空;也可做包级导出
    ├── models.py
    ├── views.py
    └── services/
        ├── __init__.py
        └── user_service.py

4.1 绝对导入(项目里最常用) #

# 从 myapp.models 模块导入 User 类
from myapp.models import User
# 从 myapp.services.user_service 导入 create_user 函数
from myapp.services.user_service import create_user
print(User)
print(create_user("John"))

4.2 相对导入(包内部模块之间) #

# myapp/views.py
# . 表示当前包 myapp
from .models import User
from .services.user_service import create_user

4.3 __init__.py #

# myapp/__init__.py(可选)
# 在包级别统一导出 User,方便外部 from myapp import User
from .models import User

5. 模块去哪找? #

# 导入 sys 模块
import sys
# 打印模块搜索路径,排查 ModuleNotFoundError 时用
print(sys.path)

6. 项目开发要点 #

7. 总结 #

概念 要点
模块 .py 文件
包 目录 + __init__.py
绝对导入 from myapp.models import User
相对导入 from .models import User(仅包内)
入口 if __name__ == "__main__":