Python Poetry 简要说明
Poetry 简介
Poetry 是一个 Python 开发工具,用于管理 Python 项目的虚拟环境、包依赖和打包发布。官网是这里。
和其他工具的比较
Poetry 和 Conda
Conda 也管理 Python 虚拟环境和软件包。它其实不限于 Python 包。
如果在 Conda 的虚拟环境下使用 Poetry,Poetry 会直接使用 Conda 的虚拟环境。这里有这个问题的说明。我不想安装 poetry-conda,便直接使用 venv 管理虚拟环境。如果要坚持使用 Poetry 自动创建和管理虚拟环境,可以执行:
pip install --user poetry-conda poetry config virtualenvs.create true poetry config virtualenvs.in-project true poetry config virtualenvs.ignore-conda-env true
Poetry 和 pip
在解决开发项目的软件包依赖方面,pip 最大的问题是,无法在移除一个包时,同时移除其依赖的包,因为其依赖的包可能仍被其他软件依赖着。Poetry 在这方面则能工作很好。因此,我主要用 pip 安装 Python 软件和一些常用的库,例如 numpy、matplotlib 等。如果是项目开发,则用 poetry 添加依赖到项目目录下的 venv 虚拟环境里。
另外,我也用 pip install -e .[dev]
来把正在开发的代码安装到当前的虚拟环境里做测试。
Poetry 和 venv、virtualenv
我觉得 Python 内置的 venv 挺方便好用的。因此我一般是直接在项目根目录下执行:
python -m venv .venv source .venv/bin/activate.fish
常用的命令和用法
poetry init
- 在当前目录下初始化,交互式,需要回答一些项目相关问题
poetry shell
- 如果当前没有虚拟环境,则创建虚拟环境;如果有,则使用当前的虚拟环境,开启一个 shell
poetry add
- 添加依赖包;如果添加
--group dev
则添加开发环境的依赖包 poetry show --tree
- 查看依赖路径
poetry lock
- 当手动修改
pyproject.toml
文件后,需要用此命令同步修改到poetry.lock
poetry install
- 安装依赖包
poetry update
- 更新
poetry export
poetry export -f requirements.txt -o requirements.txt --without-hashes --dev
导出 requirements.txtpoetry build
- 构建开发项目,生成可安装文件在 dist 目录下
pip install
时,代码仓库里的 packages 和 modules 被安装到虚拟环境里的 site-packages
里。如果开发的是一个可执行程序,则需要添加如下配置到 pyproject.toml
里:
[tool.poetry.scripts] script_name = "package_name.module_name:func_name"
注意配置里的 "." 和 ":",以及 package_name
不是目录,比如如果 package_name
在 src
目录下,配置里是不能写 src.package_name
的。
如下设置,在项目根目录创建虚拟环境:
poetry config virtualenvs.in-project true
如下设置,添加 poetry 下载依赖软件包源站:
[[tool.poetry.source]] name = "tsinghua" url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/" priority = "primary"
总结
Python 软件使用和开发过程中,需要解决的问题有:
- Python 的版本管理
- 虚拟环境管理
- 依赖包管理
- 软件打包
- 软件发布
Python 生态中,存在太多的工具来解决这些问题了。它们各自解决部分问题,有重叠的部分。因此需要明确理解它们各自的能力和局限。
我用 Conda 提供基本的 Python 环境,用来使用不同的 Python 版本和常用的基于 Python 的软件工具及库。
pip 和 venv 模块基于 Conda 的基础软件环境,用于安装软件和为开发提供虚拟环境。在 Emacs 中使用 pyvenv 可以方便地在 Conda 虚拟环境和 venv 虚拟环境中切换。
Poetry 则专注于开发过程中的软件包依赖和构建。
未来也许可以研究一下 rye 的使用。