当前位置:首页>python>Python 实现 项目指定目录,例如tasks目录封装为可导入包

Python 实现 项目指定目录,例如tasks目录封装为可导入包

  • 2026-09-07 03:15:32
Python 实现 项目指定目录,例如tasks目录封装为可导入包
最近在看pytest测试实践这本书,关于书中安装包供其他文件引用看的不太明白,因此专门研究了将项目指定目录封装为可导入包的实现方法,使其能被项目中其他文件便捷引用,以下为具体操作步骤:
步骤1:项目中新建tasks目录

在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()

最新文章

随机文章