Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Python——自定义pip包的安装和打包


整体说明

  • 打包本地项目为的 pip 包时,可以使用 pip install . 命令
  • 执行 pip install . 命令时,Python 包管理工具 pip 会根据当前目录中的 setup.py 文件来安装包
    • 这个过程涉及多个步骤,包括解析包的元数据、处理依赖关系、构建和安装包等
    • 安装的内容包括包的所有模块、数据文件、编译文件以及命令行工具
    • 默认情况下,只安装核心依赖,可选依赖需要用户显式指定

构建一个包的步骤

第一步:解析和构建

  • 解析 setup.py (setup.py 的详细示例见附录):
    • pip 首先会查找并解析当前目录中的 setup.py 文件
    • 读取包的元数据(如包名、版本、作者信息等)和安装选项(如 install_requires、extras_require 等)
  • 构建包:
    • pip 会使用 setuptools 或 distutils 来构建包
    • 包的构建包括编译C扩展(如果存在)、处理包内的数据文件等
    • 生成一个源代码分发包(Source Distribution,简称 sdist)或一个二进制分发包(Binary Distribution,简称 wheel)

第二步:处理依赖

  • 安装核心依赖
    • pip 会根据 setup.py 中的 install_requires 列表安装包的核心依赖
    • 这些依赖是包运行所必须的
  • 可选依赖
    • 如果用户在命令中指定了可选依赖组(如 pip install .[dev]),pip 会安装对应的 extras_require 可选依赖
    • 否则,默认情况下不会安装 extras_require 中的可选依赖

第三步:安装包**

  • 导入包和模块
    • pip 会将构建好的包安装到Python环境的 site-packages 目录中
    • 包中的所有模块和子包都会被导入
  • 包数据文件
    • 如果 setup.py 中设置了 include_package_data=True 或指定了 package_data,这些数据文件也会被安装
  • 命令行工具
    • 如果 setup.py 中定义了 entry_points,对应的命令行工具会被安装并注册

第四步:打包内容

  • 包和模块
    • 所有通过 packages 或 find_packages() 指定的包和模块
  • 数据文件
    • 通过 package_data 或 include_package_data 指定的额外数据文件
  • 编译文件
    • 如果包中包含 C/C++ 扩展模块,这些模块会被编译并打包

附录:setup.py 文件的示例

  • setup.py 文件是 Python 项目中用于定义包的元数据、依赖关系及其他安装相关信息的脚本
  • setup.py 文件主要通过 setuptools 或 distutils 库来实现包的配置和分发

setup.py 文件示例

  • setup.py 文件基本结构示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    from setuptools import setup, find_packages

    setup(
    name="package_name", # 包名
    version="0.1.0", # 版本号
    author="Author Name", # 作者
    author_email="author@example.com", # 作者邮箱
    description="A short description", # 简短描述
    long_description=open("README.md").read(), # 长描述(通常从README文件导入)
    long_description_content_type="text/markdown", # 长描述类型(如Markdown)
    url="https://github.com/username/repo", # 项目URL
    packages=find_packages(), # 自动发现并包含所有包
    classifiers=[ # 分类标签(如开发状态、受众、许可证)
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
    ],
    python_requires='>=3.6', # Python版本要求
    install_requires=[ # 安装依赖
    "requests>=2.25.0",
    "numpy",
    ],
    extras_require={ # 可选依赖(如开发、测试)
    "dev": ["pytest", "sphinx"],
    },
    entry_points={ # 命令行工具入口
    "console_scripts": [
    "mycommand=mypackage.module:function",
    ],
    },
    include_package_data=True, # 包含包内数据文件
    package_data={ # 指定包数据文件
    "mypackage": ["data/*.dat"],
    },
    zip_safe=False, # 是否允许打包为zip文件
    )

主要内容和功能说明

  • 元数据:
    • name : 包的名称
    • version : 包的版本号,通常遵循语义版本规范(如 MAJOR.MINOR.PATCH)
    • author 和 author_email : 作者的姓名和联系邮箱
    • description 和 long_description : 包的简短和详细描述
    • url : 项目的主页或代码仓库地址
  • 包和模块:
    • packages : 指定需要包含的包列表,通常使用 find_packages() 自动发现
    • package_data : 指定需要包含的非代码文件(如数据文件、模板等)
  • 依赖管理:
    • install_requires : 安装包时需要满足的依赖列表
    • extras_require : 可选依赖,按功能分组(如开发依赖、测试依赖)
  • Python 版本:
    • python_requires : 指定包支持的Python版本范围
  • 分类标签:
    • classifiers : 用于描述包的特性和分类,帮助用户和工具识别包的适用性
  • 命令行工具:
    • entry_points : 定义包提供的命令行工具及其入口函数
  • 数据文件:
    • include_package_data : 是否包含包内的额外数据文件
  • 打包选项:
    • zip_safe : 指定包是否可以安全地打包为zip文件

附录:setup.py 中的 extras_require 使用

  • 在 setup.py 中定义的 extras_require 提供了一种机制,可以按需安装额外的依赖项

  • extras_require 允许定义一些可选的依赖组,比如开发依赖、测试依赖等

  • 举例来说,前面附录小节的示例中 extras_require 中定义了一个名为 “dev” 的组和对应的依赖

  • 默认情况下 ,安装包时不会自动安装 extras_require 中定义的可选依赖项

    • 直接使用 pip install . 或 pip install package_name 安装包即可
    • 在这种情况下,只有 install_requires 中定义的核心依赖会被安装
  • 安装可选依赖,以 安装 “dev” 组的可选依赖 为例:

    • 使用 pip 安装时,可以通过在包名后加上 [dev] 来指定安装这些可选依赖

      1
      pip install .[dev]
    • 如果包已经发布到PyPI或其他包管理平台,可以使用以下命令:

      1
      pip install package_name[dev]

ML——HMM-MEMM-CRF

本文主要区分隐马尔可夫模型(HMM),最大熵马尔可夫模型(MEMM),和条件随机场(CRF)


HMM

  • 生成式模型
  • 有向图模型,贝叶斯网络

模型描述

  • 模型参数: \(\lambda = (A, B, \pi)\)
    • A为状态转移矩阵
    • B为观测概率矩阵
    • \(\pi\) 为初始状态概率向量
  • HMM对

假设

  • 观测序列之间独立
  • 当前状态仅仅依赖于上一个状态

问题

  • 概率计算问题: 给定模型 \(\lambda = (A, B, \pi)\) 和观测序列 \(O=(o_{1}, o_{2},,,o_{n})\),计算在给定模型下观测序列出现的概率 \(P(O|\lambda)\)
  • 学习问题: 已知观测序列 \(O=(o_{1}, o_{2},,,o_{n})\),估计模型参数 \(\lambda = (A, B, \pi)\),使得在该模型下观测序列出现的概率 \(P(O|\lambda)\) 最大.(极大似然法,EM算法)
  • 预测问题(解码问题): 给定模型 \(\lambda = (A, B, \pi)\) 和观测序列 \(O=(o_{1}, o_{2},,,o_{n})\),求状态序列 \(I=(i_{1}, i_{2},,,i_{n})\),使得 \(P(I|O;\lambda)\) 最大,(维特比算法)

序列标注问题

  • 序列标注问题是已知观测序列 \(O=(o_{1}, o_{2},,,o_{n})\),求状态序列 \(I=(i_{1}, i_{2},,,i_{n})\),使得 \(P(I|O)\) 最大
  • 实际上序列标注问题包括学习问题和预测问题两个问题:
    • 学习问题: 根据观测序列确定模型参数 \(\lambda = (A, B, \pi)\),极大似然法或EM算法(EM算法会同时估计得到最优状态序列(隐变量))
    • 预测问题: 根据模型参数和观测序列确定最优状态序列 \(I=(i_{1}, i_{2},,,i_{n})\),维特比算法

优点

  • 算法成熟
  • 效率高, 模型简单, 容易训练

缺点

  • 序列标注问题中,当前状态(标注)往往不仅仅和前一个状态相关,还可能和观察序列相关(这里指的是整个序列)
  • 也就是说每个状态可能还与整个观察序列的(除了当前观察值以外的)其他观察值(观察序列上下文)相关

MEMM

  • 判别式模型
  • 有向图模型,贝叶斯网络

假设

  • 当前状态仅依赖于上一状态和当前观测值(或所有观测值)
  • (问题: 为什么有些书上画出的图是当前状态依赖上一状态和所有观测值?,这里应该是当前观测值和所有观测值两种情况都是MEMM,<<百面>>画的是所有观测值的情况)

问题

  • MEMM似乎只用于序列标注,也就是在已知观测序列的情况下,寻找最优的状态序列
  • 有其他应用的话再添加

序列标注问题

  • 用于序列标注时,一般也包括两个问题: 学习问题和预测问题
    • 学习问题: 根据观测序列确定模型参数(每条边的(概率)值和初始状态?)
    • 预测问题: 根据模型和观测序列确定维特比算法

优点

  • 解决了观测独立性问题(观测独立性是只当前观测序列只与当前状态相关)[问题: 在MEMM中并不关心观测序列由谁影响,而是关心观测序列如何影响了状态序列]

缺点

  • 标签偏置(labeling bias)问题
    • MEMM中概率最大路径往往容易出现在转移少的状态中
    • MEMM归一化在加和函数 \(\sum\) 计算内部,而CRF的归一化在加和函数 \(\sum\) 的外部,这使得MEMM只会关注加和函数[原始建模问题概率值 \((y_{1…n}|x_{1…n})\) ]的局部特征,而不是的整体特征,所以MEMM存在偏置问题
  • 比HMM复杂

CRF

  • 判别式模型
  • 无向图模型,马尔可夫网络

假设

  • 当前状态仅依赖于上一状态和当前观测值(或所有观测值)
  • (问题: 为什么有些书上画出的图是当前状态依赖上一状态和所有观测值?,这里应该是当前观测值和所有观测值两种情况都是线性CRFs,<<百面>>画的是所有观测值的情况)
  • 与MEMM的区别就是无向图模型与有向图模型的区别

问题

序列标注问题

优点

  • 模型复杂,能建模更多可能的特征
  • 全局归一化(这里与MEMM的区别是,MEMM归一化在加和函数[原始建模问题概率值 \((y_{1…n}|x_{1…n})\) ] \(\sum\) 计算内部,而CRF的归一化在加和函数[原始建模问题概率值 \((y_{1…n}|x_{1…n})\) ] \(\sum\) 的外部)

缺点

  • 模型复杂,速度慢
1…300301302…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4