在python项目src目录下新建一个tasks目录
├── src/# 源代码目录
│└── tasks/# 指定的tasks目录
│├── init.py# 包初始化文件,定义了导出内容
│└── models.py# 定义一个Task类,供其他文件来引用
│ setup.py# 在项目的根目录下新建一个setup.py,setup.py用来定义如何打包、安装和分发你的 Python包

models.py
Python # 这里定义 Task # 从 Python 标准库的 collections 模块中导入 namedtuple 工厂函数 #(用于创建带名称字段的元组类) from collections import namedtuple # 创建一个名为 Task 的类,包含两个字段:summary-任务描述 owner-负责人 Task = namedtuple('Task', ['summary', 'owner']) #设置默认参数值——两个字段都默认为 None Task.__new__.__defaults__ = (None, None) |
init.py
Python # 从当前包(tasks)的 models 模块中导入 Task 类 from .models import Task # __all__ 定义了当使用 from tasks import * 时,哪些名称会被导出 # 这里只允许 Task 被通配符导入 __all__ = ['Task'] |
__all__用法解析
__all__ 只控制 import *(通配符导入)
显式导入(如 import Task)不受 all 限制,只要名字在包的命名空间里就能找到
Python __all__定义了当使用 from tasks import * 时,哪些名称会被导出 场景1:代码中配置如下代码 __all__ = ['Task'] 作用说明 导入方式效果 from tasks import Task✅ 可以直接导入 Task from tasks import *✅ 只导入 Task(受 all 控制) from tasks.models import Task✅ 也可以直接从子模块导入 场景2:代码中无__all__代码 from tasks import Task# ✅ 成功!直接找 Task 这个名字from tasks import *# ❌ 失败!不知道要导入什么原理:from tasks import Task↓ 直接到 tasks/__init__.py 的命名空间里查找 'Task' ↓ 找到了(因为 from .models import Task 已经把 Task 放进来了) ↓ ✅ 导入成功 from tasks import *↓ 看 __all__ 列表 → 没有定义 → 不知道导什么 → ❌ 失败 |
init.py 文件详细解析
Python __init__.py 文件是 Python 包(Package)的核心文件,它有多重作用: 作用1: 标识目录为 Python 包一个目录中只要有 __init__.py,Python 就将其视为一个包而非普通目录 没有此文件,目录只是文件夹,不能被导入 作用2:包初始化入口当包被导入时,__init__.py 中的代码首先被执行 可用于执行包的初始化工作(如连接数据库、加载配置等) 作用3: 控制包的导入行为(最核心的作用)例如上面的init.py文件使得 Task 类在包级别可用 其他文件可以直接 from tasks import Task,无需知道 Task 在哪个子模块 |
setup.py
Python # setup.py from setuptools import setup, find_packages setup( name='myproject',#项目名称:安装后通过这个名称引用 version='0.1.0',#版本号:遵循语义化版本规范 主版本.次版本.修订号 package_dir={'': 'src'},# 关键!告诉 setuptools 包在 src 目录下 packages=find_packages(where='src'),# 在 src 目录中查找包 description='一个任务管理包', author='Your Name', python_requires='>=3.7', classifiers=[ 'Programming Language :: Python :: 3', 'License :: OSI Approved :: MIT License', ], ) |
setup.py 是 Python 项目的构建和分发配置文件,它定义了如何打包、安装和分发你的 Python 包。
代码解析:
Python #setuptools: Python 的打包工具库,替代了旧的标准库 distutils #setup: 核心函数,用于配置项目 #find_packages: 自动查找项目中的包(包含 __init__.py 的目录) from setuptools import setup, find_packages #包目录映射:将包的根目录指向 src/ 文件夹; package_dir = {'': 'src'} #↑↑ #包名实际路径 #(空字符串表示根包) package_dir={'': 'src'} #自动发现包:在 src/ 目录中查找所有 Python 包 packages=find_packages(where='src') #分类器:帮助 PyPI 对项目进行分类和搜索 #Programming Language :: Python :: 3:表示这是 Python 3 项目 #License :: OSI Approved :: MIT License:表示使用 MIT 许可证 classifiers=[ 'Programming Language :: Python :: 3', 'License :: OSI Approved :: MIT License', ] |
步骤2:以开发模式安装包
PowerShell pip install -e . 备注: Python 包管理中开发模式(editable mode) 安装本地包的核心命令,核心作用是将当前目录的 Python 包以 “可编辑 / 开发” 方式安装到环境中;当前用的是哪个环境的 pip,包就会被安装到哪个环境中 |
步骤3:验证其他文件能否引用tasks包里面的Task类。
在src目录新建main.py
Python # main.py from tasks import Task# 注意:这里从包导入,不是从文件导入 import sys def main(): print("测试 Task 导入...") # 测试 1: 创建默认任务 task1 = Task() print(f"✅ 默认任务: {task1}") # 测试 2: 创建带值任务 task2 = Task("学习Python", "小明") print(f"✅ 带值任务: {task2}") # 测试 3: 访问属性 print(f"✅ 任务摘要: {task2.summary}") print(f"✅ 任务负责人: {task2.owner}") # 测试 4: 测试默认值 task3 = Task("仅摘要") print(f"✅ 仅摘要任务: {task3}") # 测试 5: 测试解构 summary, owner = task2 print(f"✅ 解构: 摘要='{summary}', 负责人='{owner}'") print(sys.path) if __name__ == "__main__": main() |
