还在用 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

相关推荐
徒 花7 分钟前
Python知识学习08
java·python·算法
喵个咪14 分钟前
go-wind-cms 微服务架构设计:为什么基于 Kratos?
后端·微服务·cms
神奇小汤圆20 分钟前
百度面试官:Redis 内存满了怎么办?你有想过吗?
后端
喵个咪21 分钟前
Headless 架构优势:内容与展示解耦,一套 API 打通全端生态
前端·后端·cms
开心就好202523 分钟前
HTTPS超文本传输安全协议全面解析与工作原理
后端·ios
小江的记录本25 分钟前
【JEECG Boot】 JEECG Boot——数据字典管理 系统性知识体系全解析
java·前端·spring boot·后端·spring·spring cloud·mybatis
神奇小汤圆26 分钟前
Spring Batch实战
后端
喵个咪28 分钟前
传统 CMS 太笨重?试试 Headless 架构的 GoWind,轻量又强大
前端·后端·cms
程序员木圭31 分钟前
07-数组入门必看!Java数组的内存分析02
java·后端
前端技术32 分钟前
ArkTS第三章:声明式UI开发实战
java·前端·人工智能·python·华为·鸿蒙