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

相关推荐
radient4 分钟前
属于Agent的课本 - RAG
人工智能·后端·程序员
万粉变现经纪人5 分钟前
如何解决 pip install -r requirements.txt 子目录可编辑安装缺少 pyproject.toml 问题
开发语言·python·scrapy·beautifulsoup·scikit-learn·matplotlib·pip
程序员阿达7 分钟前
开题报告之基于SpringBoot框架的路面故障信息上报系统设计与实现
java·spring boot·后端
用户3421674905529 分钟前
鱼皮模拟面试,吊打面试官
后端
Blossom.11811 分钟前
把 AI“缝”进布里:生成式编织神经网络让布料自带摄像头
人工智能·python·单片机·深度学习·神经网络·目标检测·机器学习
滑水滑成滑头20 分钟前
**点云处理:发散创新,探索前沿技术**随着科技的飞速发展,点云处理技术在计算机视觉、自动驾驶、虚拟现实等领域的应用愈发广
java·python·科技·计算机视觉·自动驾驶
gc_22991 小时前
学习Python中Selenium模块的基本用法(19:操作下拉框)
python·selenium
我是天龙_绍1 小时前
java 中的 Lombok
后端
hwangsy1 小时前
SpringCloud gateway偶发creationTime key must not be null
后端
初见0011 小时前
Spring事务失效的十大陷阱与终极解决方案
后端·架构