概述
poetry是一个Python包管理工具,他可以替代pip和virtualenv,提供了更好的依赖管理和包发布功能。
与其他包管理工具的对比
安装
linux包管理器
以Ubuntu 24.04为例:只需要使用apt安装即可
sudo apt-get install python3-poetry |
上边命令不能执行的,也可以采用官网的其他方式,详见https://python-poetry.org/docs/#installation
脚本安装
curl -sSL https://install.python-poetry.org | python3 - |
pipx安装
pipx 是一個专门用于安装和管理Python命令行工具的包管理器。是pip installable executables的缩写,它可以让你在虚拟环境中安装Python工具,然后通过命令行直接调用这些工具。
pip install pipx |
使用
基本使用
创建新项目
poetry new my_project |
会在new_project目录下生成一个新的项目,包含了pyproject.toml文件
或者也可以在你的项目中运行
poetry init |
他会把你的项目变成一个poetry项目,生成pyproject.toml文件
进入虚拟环境
使用以下命令进入虚拟环境,
如果虚拟环境不存在,他使用设定的Python版本(详见下文<使用不同的Python版本>)创建一个虚拟环境
poetry shell |
后边的命令都要先进入虚拟环境才能执行
包管理
安装pyproject.toml中的依赖
poetry install |
新增安装包,执行后会安装包,并在pyproject.toml中添加依赖
安装包xxx1 xxx2, 会根据依赖计算一个适合的最新的版本 |
卸载包, 执行后会卸载包,并在pyproject.toml中删除依赖
poetry remove xxx1 xxx2 |
更新包
假设先前安装了一个包要求版本大于3.2, 小于4.0, 现在这个包的新版本有3.9,4.0,执行如下命令,将会更新这个包到3.9版本
poetry update |
查看当前已安装包的版本
poetry show |
当然也可以手动修改pyproject.toml文件,然后执行以下命令安装依赖
poetry lock |
比如pyproject.toml 中原先requests<=2.32.2,假如修改为requests<=2.31.2,执行上边的命令,会从2.32.2版本的requests降级为2.31.2版本
不进入虚拟环境直接执行命令
可以通过poetry run来执行命令,比如执行项目中的main.py
poetry run python main.py |
如果虚拟环境不存在,poetry会自动创建一个虚拟环境
虚拟环境管理
查看当前虚拟环境
poetry env info |
退出虚拟环境
exit |
查看当前存在的虚拟环境
poetry env list |
删除虚拟环境
xxx是env list中显示的名字 |
镜像源配置
poetry暂时没提供原生的全局镜像源配置,只能在每个项目中配置
如果要配置全局镜像源,需要借助第三方的插件
仓库级配置
poetry source add --priority=primary mirrors https://pypi.tuna.tsinghua.edu.cn/simple/ |
全局配置
详见
https://github.com/arcesium/poetry-plugin-pypi-mirror?tab=readme-ov-file
poetry self add poetry-plugin-pypi-mirror |
然后在~/.config/poetry/config.toml中添加如下内容
[plugins] |
使用不同的Python版本
使用pyenv管理Python版本
默认poetry使用系统的Python版本,如果你要安装的包需要其他版本的Python,需要预先安装这个版本的Python (这个是跟conda的一个区别,conda会自动安装指定的Python版本,poetry需要自行解决)
官网推荐使用pyenv管理Python版本
安装pyenv |
安装pyenv后,需要在~/.bashrc中添加如下内容
export PYENV_ROOT="$HOME/.pyenv" |
以下用于解决国内pyenv安装Python时,下载速度慢的问题,设置Python安装镜像为国内的淘宝镜像地址; 需要的话可以在~/.bashrc中追加以下两行
可选的其他镜像地址(配置PYTHON_BUILD_MIRROR_URL环境变量以应用):
export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1 |
重载bashrc配置以在当前shell应用上边的命令
source ~/.bashrc |
假如需要安装Python3.11,
首先根据官方文档,安装缺失的系统依赖库https://github.com/pyenv/pyenv/wiki#suggested-build-environment
如Ubuntu执行下列命令安装依赖项
sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \ |
然后可以使用如下命令来安装指定的Python版本了
pyenv install 3.11.0 |
输入如下,表示安装成功
Downloading Python-3.11.0.tar.xz... |
* system (set by /home/deepwzh/.pyenv/version) |
可以看到多了一个新安装的3.11.0的版本
选择使用Python版本
在开始前,先执行
python3 --version |
可以得知当前系统的Python版本,这里笔者的是3.12.0
新建一个项目, 执行poetry init, 交互如下,选择的是Python3.11版本
|
使用pyenv指定要使用的Python版本,这里用我们刚安装的3.11
pyenv local 3.11 |
pyenv local命令会在项目目录生成一个.python-version文件,内容为指定的Python版本号
poetry env info |
查看刚才的输出,Virtualenv和Base的Python版本是3.11.0,说明我们成功切换了Python版本
Virtualenv中的Executable是Python的路径,他是一个指向Base的软连接,并不是独立安装的Python
包的发布
待补充
docker中使用
这里提供一个dockerfile的模板
FROM docker.io/python:3.12-slim |
单独拷贝pyproject.toml和poetry.lock,是为了利用docker的缓存机制,只有在这两个文件改变的时候,才会重新安装依赖
配置virtualenvs.create false是为了不在docker中创建虚拟环境,直接在全局安装,这样就可以直接python main.py来运行而不需要进入虚拟环境