Python Distribution, Packaging and pip
文章目录
教程
术语
- Python Package Index
Python Package Authority
- 管理机构,一个开发者维护者委员会
distutils(1998)
- 过时的分发工具
setuptools(2004)
- distutils 替代工具
wheel
分发工具(打包)
- distutils
setuptools
build
- GitHub - pypa/build: A simple, correct PEP 517 build frontend
- 执行打包的前端工具
- 命令行友好:
python -m build
resource 访问
importlib_resources
- 参考: Using importlib_resources — importlib-resources 5.4.1.dev15+g0526c20.d2022021…
- importlib.resources 的向后兼容工具
推荐
- 相对于 importlib.resources, 可以提供一致接口
- importlib.resources 不同 python 版本,接口不一致
importlib.resources
- 参考: importlib.resources
- python >= 3.7
pkg_resources
从属于 setuptools, 但是是一个独立的包
- 导入方法:
import pkg_resources
- 导入方法:
importlib_resources
获取 data file 路径
| |
files 获取 package 路径
- 对于 压缩包,通过临时解压缩得到路径
- as_file 创建 context 对象,便于回收数据
过时用法
制作 context 对象
- open_text
- open_binary
- path
读取数据
- read_text
- read_binary
路径
- path
data file 列表
- contents(package)
判断
- is_resource(package, name)
pkg_resources
注意:
- 不是 setuptools 的子模块
- 是 setuptools 的项目的子项目
好处:
即使整个包是放在压缩文件中的,也可访问
- 这种 os.path 路径操作就无法访问了
data 文件
获取文件名(路径)
pkg_resources.resource_filename
| |
获取文件内容
pkg_resources.resource_string
- 类似 open('filename.txt'), 返回 bytes 类似数据
| |
限制
在 email, email/tests, email/tests/data 文件夹下都要有
__init__.py文件- 其中 data 下的
__init__.py是不必要的,我们不是作为包文件,只是用来放 data files
- 其中 data 下的
- 即,需要创建不必要的 python sub packages
包管理工具
pip
- 官方安装包工具
- 笔记:org:note/python/pip.org
pipx
- 单机应用安装工具,python 编写的单机应用,类似 apt、brew
- 参考:pipx · PyPI
pipenv
- 项目虚拟环境管理器;项目包管理器,类似 yarn
- 参考:Pipenv: Python Dev Workflow for Humans
- 笔记:org:note/python/pipenv.org
poetry
- 类似 pipenv 的多功能包管理工具
参考
- 笔记: org:note/python/poetry.org
功能
包管理
- 虚拟环境,类似 pipenv
项目管理
- 打包
- 发布
pyenv
- 笔记:org:note/python/pyenv.org
- python 版本切换工具
可以与 pipenv, poetry 联用
1 2 3pyenv local 3.8.10 # 自动关联到 python-3.8.10 poetry install
conda
工具联用
poetry 和 pyenv 联用
方法一
- pyenv install 安装 python 版本
- pyenv local 切换项目 python 版本
- poetry install 自动关联 python 版本
- poetry shell 切换到 virtualenv
方法二
poetry env use /full/path/to/python guanlian
- 使用 pyenv 安装的具体版本
- poetry env use ~/.pyenv/versions/<python-version>/bin/python
- poetry shell 切换到 virtualenv
conda 和 pyenv 分别单独安装使用
- 不要同时切换 pyenv 和 conda activate
解决方法
- 单独使用两者,退出一个再启用另一个
- 避免交叉使用
pyenv
- 激活:pyenv global py38
- 退出:pyenv global system
conda
- 激活:conda activate conda38
- 退出:conda deactivate conda38
C 扩展打包
- 使用 setuptools.setup() + Extension 类实现
参考
原理
- Extension 类实例,制作单个 C 模块
- setup(ext_modules=List[Extension]),传入 c 模块
- 执行编译
python setup.py build
Cython
例子 setup.py
1 2 3 4 5 6 7 8from setuptools import setup from Cython.Build import cythonize setup( name='Hello world app', ext_modules=cythonize("hello.pyx"), zip_safe=False, )- 执行
python setup.py build_ext --inplace
poetry
- 通过 build.py 文件实现
参考
步骤
修改 pyproject.toml
1 2[tool.poetry] build = "build.py"创建 build.py 文件
在其中创建
def build(setup_kwargs: dict) -> None函数实现- setup_kwargs 是 dict 类型,函数内部修改,即可在外部访问修改 后的值,无需返回
- 函数内部修改,添加 c 扩展编译打包信息
打包工具
setuptools
- 古老
poetry
- 包管理一体
flit
- 简单
pdm
- 新
测试工具
- pytest
tox
- 不同 python 版本测试
- 参见:tox notes
文件布局 layout
参考:
src 布局
- 代码存放到 src 文件夹中
flat layout
- 代码直接放到 project-root 中
文章作者
上次更新 2024-01-05 (5c92d1c)