还在用 pip 管理依赖吗?来试试 poetry 吧!

为什么要换 poetry

对老 Python 来说,pip 看起来是一个不错的选择。我曾经写过一篇使用 condapip 来对项目依赖进行管理的文章,里面就有一个问题无法解决:在更换了系统/架构之后,可能需要手动编辑依赖列表才能导入。pip 还有一个大的缺陷是无法进行虚拟环境的自动切换。

因此, pip 主要的问题是:

  • 没有一个依赖 lockfile(例如 composer.lock, go.sum
  • 没有自动化的虚拟环境管理

因此,一个比较现代的工具,poetry,闪亮登场。

安装

需要先安装 pipx,再安装 poetry

bash 复制代码
brew install pipx
pipx ensurepath
pipx install poetry

安装 zsh 自动补全插件

bash 复制代码
mkdir $ZSH_CUSTOM/plugins/poetry
poetry completions zsh > $ZSH_CUSTOM/plugins/poetry/_poetry

之后需要在 .zshrc 中增加 poetry 插件。

常见用法

在已有项目中初始化 poetry

bash 复制代码
cd pre-existing-project
poetry init

安装依赖

bash 复制代码
poetry add <package>

安装全部依赖(已有pyproject.toml

bash 复制代码
poetry install

更新全部依赖

bash 复制代码
poetry update

配置 pre-commit

首先需要将依赖安装到开发环境中。

  • pre-commit: 在 commit 前运行一些脚本
  • black: 对代码进行格式化
  • isort: 对 import 进行排序
  • autoflake: 移除未使用的 import 等
bash 复制代码
poetry add -G dev pre-commit black isort autoflake

修改 pyproject.toml

yaml 复制代码
[tool.isort]
profile = "black"

增加 .pre-commit-config.yaml 。一定要按照 autoflake -> isort -> black 的顺序执行,不然可能格式化出来的代码又被下一个工具修改成别的样子,导致格式化结果不一致。

值得一提的是,每一步结尾的 git add u 作用是把前面修改的文件重新添加至暂存区(stage),否则后续的工具无法对上一步格式化的文件进行进一步处理。

yaml 复制代码
fail_fast: true
repos:
  - repo: local
    hooks:
      - id: autoflake
        name: Remove unused variables and imports
        entry: bash -c 'autoflake "$@"; git add -u' --
        language: python
        args:
          [
            "--in-place",
            "--remove-all-unused-imports",
            "--expand-star-imports",
            "--ignore-init-module-imports",
          ]
      - id: isort
        name: Sorting import statements
        entry: bash -c 'isort "$@"; git add -u' --
        language: python
        types: [file, python]
      - id: black
        name: Black Python code formatting
        entry: bash -c 'black "$@"; git add -u' --
        language: python
        types: [file, python]
        args: [--line-length=120]

CI/CD 中的使用

见示例 Dockerfile。

第一部分需要为镜像安装 poetry,然后关闭虚拟环境,全局安装依赖,这一部分其实可以打包成基础镜像。第二部分是项目的依赖安装。第三部分就是将应用代码复制到镜像中(可以用 .dockerignore 来排除部分无用文件来达到减小镜像体积的效果)。

Dockerfile 复制代码
FROM python:3.11.6-slim
RUN pip install poetry && poetry config virtualenvs.create false

WORKDIR /app
EXPOSE 8000
COPY pyproject.toml poetry.lock ./
RUN poetry install --no-dev

COPY . .
ENTRYPOINT ["python", "main.py"]

Ref

相关推荐
考虑考虑几秒前
kafka4安装
后端·kafka·自动化运维
orient7 分钟前
慢查询优化 10 招:从 EXPLAIN 到索引重建
后端
lewis_lk7 分钟前
uv: Python 新一代极速包管理工具
python
promising_xxx20 分钟前
深度学习个人开源知识库 深度筑基 | DeepBase
人工智能·python·深度学习·计算机视觉·ai·语言模型·nlp
用户409666013175121 分钟前
MySQL 事务与锁机制实战:从隔离级别到死锁排查
后端
三十岁老牛再出发29 分钟前
07.07.每日总结
c语言·windows·python
zhangxingchao36 分钟前
AI应用开发九:从 Hermes Agent 学长期记忆
前端·人工智能·后端
C137的本贾尼1 小时前
MCP 完全指南:从零开始掌握模型上下文协议
人工智能·python
默默敲代码的徐哥儿1 小时前
八股文整理——后端
java·开发语言·spring boot·后端·学习
自由的裙子1 小时前
ASP.NET路由模型解析
后端·asp.net