2025-09-25
Python基础
00
请注意,本文编写于 86 天前,最后修改于 86 天前,其中某些信息可能已经过时。

目录

前言
基本概念理解
Poetry 与 Pipenv 的主要区别
总结
Poetry 安装与基本命令
1. Poetry的安装与配置
2. Poetry 项目初始化于目录结构介绍
1. 创建新的初始化项目
2. 初始化现有项目
Poetry 虚拟环境管理
1. Poetry环境激活与创建
1. poetry 1.8.XX版本
2. poetry 2.XX版本
2. Poetry依赖包管理
Poetry 项目构建及发布
参考文章

前言

 Poetry 是 Python 中用于依赖管理和打包的工具。它最强大的功能是打包与分发,第一次通读peotry官方文档后,给我的感觉是peotry与Pipenv他俩差不多呀,我甚至还感觉peotry不如Pipenv,因为它在进行应用项目的依赖管理的时候,无法像Pipenv那样通过Pyenv自动安装python解释器,而是显性的指定Python解释器。经过一些简单的实践与探索我才体会到peotry的强大,并为自己浅薄的见解感到惭愧。在这里我将对Poetry 安装与基本命令依赖管理打包与发布这几个阶段进行实践的简单记录,以便日后复盘。

基本概念理解

  1. 打包(Build):把你的 Python 代码、依赖和元数据(比如版本、作者、说明)打包成一个可分发的格式(wheel 或 sdist)。
  2. 发布(Publish):把打包好的文件上传到 PyPI 或私有仓库。
  3. 依赖管理:安装、锁定和管理项目所需的第三方库。
  4. 在 Python 项目中,如果你想把自己的代码发布到 PyPI(让别人可以 pip install 安装),通常需要做打包与分发这两件事儿。

Poetry 与 Pipenv 的主要区别

功能PoetryPipenv备注
依赖解析新的、快速、确定性老的、可能慢Poetry 更可靠
虚拟环境管理每个项目单独 venv,可手动指定 Python自动创建 venv,可集成 PyenvPoetry 更显式,Pipenv 更自动
打包与发布支持完全,使用 pyproject.toml支持有限,依赖 setup.pyPipfilePoetry 对库发布更好
pyproject.toml 支持完全支持 PEP 518/621部分支持Poetry 更符合现代标准
Python 解释器安装不会自动安装可通过 Pyenv 自动安装Poetry 需要手动指定路径
Lock 文件poetry.lock,跨系统可重现Pipfile.lock两者都可重现环境,但 Poetry 更严格

总结

  • 如果咱的目标主要是应用项目的依赖管理,Pipenv会更方便。
  • 如果你想做库的发布、环境可复现、符合现代 Python 标准,Poetry 更强。
  • Poetry不能自动安装Pyenv的Python解释器是设计选择,它希望开发者显式管理 Python,而不是Poetry自动决定。

Poetry 安装与基本命令

1. Poetry的安装与配置

zsh
# 安装 Poetry(pipx 或官方推荐方式) pipx install poetry # 回退稳定版本(目前2.XX版本存在一些bug让我吃了点苦头😡) pipx install "poetry==1.8.3" --force # Zsh 启用 Tab 补全功能 poetry completions zsh > ~/.zfunc/_poetry # 查看~/.zshrc配置文件中是否存在一下命令,若没有请添加 fpath+=~/.zfunc autoload -Uz compinit && compinit # 更新 Poetry pipx upgrade poetry # 删除 Poetry pipx uninstall poetry # 创建项目 poetry new my_project poetry init # 也可用现有项目 # 查看虚拟环境列表,注意只有在创建项目的目录下方能生效 poetry env list

2. Poetry 项目初始化于目录结构介绍

1. 创建新的初始化项目

zsh
# 创建新的初始化项目,名为“poetry-demo” poetry new poetry-demo # 查看目录结构 tree demo-project1 -a # 项目目录结构如下 demo-project1 ├── pyproject.toml ├── README.md ├── src │   └── demo_project1 │   └── __init__.py └── tests └── __init__.py 4 directories, 4 files

踩坑

本人在初始化项目的时候,产生如下报错:

zsh
poetry new demo-project Command '['/Users/jingwei/.pyenv/shims/python', '-EsSc', 'import sys; print(sys.executable)']' returned non-zero exit status 127.

情景:
本机系统中python解释器版本为py3.11.1,pyenv安装的py版本为2.7.18、3.9.1、3.10.7。当时在pyenv local命令作用的文件夹中可以使用poetry new命令创建项目,但是当我在此文件夹外进行poetry new命令创建项目时就会调不到system版本。

报错内容分析:

  1. 在 macOS 上,如果你安装了 pyenv,它会在 ~/.zshrc 或 ~/.bashrc 里加一段初始化代码,并把 ~/.pyenv/shims 放到 PATH 最前面
zsh
export PATH="$HOME/.pyenv/shims:$PATH"

这意味着:

  • 任何 python 命令都会先调用 shim,而不是系统的 /usr/bin/python3。
  • shim 会根据当前目录的 .python-version、pyenv local/global 版本,找到实际的 Python 解释器。
  1. 但是当我pyenv versions查看管理的版本的时候发现存在system,为什么 Poetry 不能直接用 system Python?
  • Poetry 在创建项目时,会调用 python 命令来初始化虚拟环境。
  • 因为 PATH 优先 shim,所以它调用的是:
zsh
/Users/jingwei/.pyenv/shims/python
  • shim 会查找当前目录/全局设置对应的 pyenv 版本。

    • 如果 global/local 版本是 system,正常情况下应该指向系统 Python。
    • 但是如果当前 shell环境没正确初始化 pyenv,或者某些目录下有 .python-version 指向不存在的版本,shim 就会失效 → Poetry 调用 shim 时报 127

解决方法:

  1. 法一:通过pyenv安装系统版本python,并通过pyenv global设置全局python版本,在Poetry调用shim的时候 shim 找到实际解释器。
  2. 法二:在创建项目时直接指定解释器
zsh
poetry new demo-project --python=/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11

创建项目的同时,项目中会自动生成pyproject.toml 是 Poetry 项目的核心配置文件,该文件的用途是依赖管理、构建、打包、发布:

zsh
# 查看pyproject.toml文件内容 nano pyproject.toml [project] name = "demo-project1" version = "0.1.0" description = "" authors = [ {name = "JingWei",email = "qi.zhang010711@gmail.com"} ] readme = "README.md" requires-python = ">=3.11" dependencies = [ ] [tool.poetry] packages = [{include = "demo_project1", from = "src"}] [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api"

注意

在 Poetry 1.x 系列,pyproject.toml 里默认写的是:

zsh
python = "^3.13"

Poetry 的模板文件里写死了最新的 Python 版本(目前 1.8.3 就是这样)。 所以它和你当前系统用的 Python 版本(不管是 pyenv local,还是 python --version)无关。 换句话说: poetry new 生成的 pyproject.toml 永远是个固定模板,不会根据你机器上的 Python 动态生成。

解决方法:

方法操作命令
1. 手动修改(推荐)打开 pyproject.toml,改成:
python = "^3.10" 或更精确:python = ">=3.10,<3.11"
2. 自动化创建(Poetry 2.x 支持)Poetry 2.0+ 里,可以用:
poetry init --python=3.10
这样生成的约束就是你指定的版本,而不是写死 ^3.13

pyproject.toml 配置说明

区域内容作用
[project]PEP 621 标准,存放项目的基本元数据,其他工具也能读取(如 pip、build、tox)
name = "demo-project1"包名项目的名字(在 PyPI 上的名称),发布时使用
version = "0.1.0"版本号遵循 语义化版本规范,例如 major.minor.patch
description = ""描述项目的简要介绍
authors = [...]作者信息作者列表,这里你设置了姓名 + 邮箱
readme = "README.md"说明文档指定项目的 README 文件,会在 PyPI 展示
requires-python = ">=3.11"Python 版本范围限定支持的 Python 版本(这里是 3.11 及以上)
dependencies = []运行依赖项目运行时所需的依赖包,发布到 PyPI 时会自动标注,在这里您可以列出项目需要的所有依赖包。 就像旧 requirements.txt 文件一样。 您可以手动完成此操作,然后调用命令 poetry install 以将其全部安装以用于软件包开发和工作目的。 如果您使用 poetry add <dependency_name>安装依赖包 相当于使用 pip install <dependency_name>
区域内容作用
[tool.poetry]Poetry 特有配置,扩展了 PEP 621 之外的功能
packages = [{include = "demo_project1", from = "src"}]包路径配置指定源码路径:包名是 demo_project1,它的源码位于 src 目录下。这是 “src 布局”,常见于中大型项目,可以避免 import 时混淆项目根目录与包目录。
区域内容作用
[build-system]PEP 517/518 标准,声明项目的构建系统
requires = ["poetry-core>=2.0.0,<3.0.0"]构建依赖构建项目所需的依赖,这里使用 poetry-core(轻量化版本的 Poetry,不包含命令行)
build-backend = "poetry.core.masonry.api"构建后端告诉 Python 构建工具(如 pip install .)该如何构建项目

2. 初始化现有项目

zsh
# 进入现有项目目录(我的已有项目名称为PeotryDemo),初始化项目 cd PeotryDemo poetry init # 查看目录结构 tree PeotryDemo -a # 项目目录结构如下 PeotryDemo ├── .idea │   ├── .gitignore │   ├── inspectionProfiles │   │   ├── profiles_settings.xml │   │   └── Project_Default.xml │   ├── misc.xml │   ├── modules.xml │   ├── PeotryDemo.iml │   └── workspace.xml ├── main.py └── pyproject.toml 3 directories, 9 files

相关信息

由于我是通过Pycharm创建的项目,所有其中的.idea文件夹为IDE配置,非poetry生成的,poetry仅生成一个pyproject.toml文件。

在进行初始化的过程中,存在以下交互过程,整理如下:

  1. poetry init 提示语详解
提示语你的输入解释
This command will guide you through creating your pyproject.toml config.-说明这是一个交互式向导,会一步一步帮你生成 pyproject.toml
Package name [peotrydemo]:PoetryDemo包名(默认取当前文件夹名),用于发布到 PyPI 的项目名,必须小写、无空格,建议保持一致:poetrydemo
Version [0.1.0]:(回车,默认 0.1.0)项目的版本号,遵循 语义化版本 规则(major.minor.patch)
Description []:验证已有项目初始化项目描述,显示在 PyPI 或文档中
Author [JingWei qi.zhang010711@gmail.com, n to skip]:(回车,默认)作者信息,可多人
License []:MIT许可证类型(如 MIT、Apache-2.0、GPL-3.0 等),会写入 pyproject.toml 并在 PyPI 展示
Compatible Python versions [>=3.11]:(回车,默认)指定兼容的 Python 版本,格式为 PEP 440 约束,比如 >=3.8,<3.12
  1. 依赖配置
提示语你的输入解释
Would you like to define your main dependencies interactively? (yes/no) [yes]yes是否现在添加 运行依赖(生产环境需要的依赖,比如 requests、flask)
You can specify a package in the following forms:-支持多种依赖格式:包名、带版本约束、git 仓库、本地路径、远程 URL
Package to add or search for (leave blank to skip):requests你输入了 requests,Poetry 会去 PyPI 搜索
Found 152 packages matching requests-找到了很多可能的候选包
Enter package # to add...0选择第一个(即官方 requests 包)
Enter the version constraint...(回车,默认 latest)不填就自动选最新的稳定版,并加上 caret 约束(^),即兼容版本范围
Using version ^2.32.5 for requests-代表安装 requests>=2.32.5,<3.0.0
  1. 开发依赖
提示语你的输入解释
Would you like to define your development dependencies interactively? (yes/no) [yes](你回车 yes)是否添加 开发依赖(仅开发/测试需要,比如 pytest、black)
Package to add...(回车跳过)没有额外开发依赖
  1. 结果确认
提示语生成内容解释
Generated filepyproject.toml 内容根据前面填写的内容生成配置文件
Do you confirm generation? (yes/no) [yes]yes确认写入 pyproject.toml
  1. 交互配置完毕后,展示最终配置好后的pyproject.toml文件
zsh
[project] name = "poetrydemo" # 包名(小写,最终写回默认) version = "0.1.0" # 项目版本 description = "验证已有项目初始化" # 项目描述 authors = [ {name = "JingWei",email = "qi.zhang010711@gmail.com"} ] license = {text = "MIT"} # 许可证 readme = "README.md" # README 文件 requires-python = ">=3.11" # Python 版本约束 dependencies = [ # 运行依赖 "requests (>=2.32.5,<3.0.0)" ] [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] # 构建依赖 build-backend = "poetry.core.masonry.api" # 构建后端

Poetry 虚拟环境管理

Pipenv/venv和Poetry在虚拟环境的“进入方式”上有一些差异:

  • Pipenv:pipenv shell 会直接进入虚拟环境,并在命令行前显示 (project-name-xxxx) 前缀。
  • venv:source venv/bin/activate 同样会修改 PS1,在命令行前显示 (venv)。
    也就是说在上述两种工具激活虚拟环境即进入虚拟环境,但是Poetry 2.0则不同,激活与进入是分开的。

1. Poetry环境激活与创建

1. poetry 1.8.XX版本

zsh
## 进入项目目录,显式的激活虚拟环境(所用的py解释器为系统的最高版本解释器) poetry shell ## 切换虚拟环境:若想指定py解释器,请修改pyproject.toml中的解释器版本之后,指定解释器激活环境,激活命令如下: poetry env use /Users/jingwei/.pyenv/versions/3.10.7/bin/python3.10 ## 查看虚拟环境信息 poetry env info ## 显示虚拟环境所有列表 poetry env list ## 显示虚拟环境绝对路径 poetry env list --full-path ## 退出虚拟环境 exit ## 查看py版本(未显性激活可查看) poetry run python -V ## 删除虚拟环境 1.可以直接删除虚拟环境文件夹 2.通过poetry env remove命令删除 poetry env remove python3

2. poetry 2.XX版本

zsh
## 进入项目目录,执行 poetry env activate ## 复制输出的 source .../bin/activate 命令,手动执行一次 source .../bin/activate ## 退出虚拟环境 deactivate ## 彻底退出并关掉窗口 exit

2. Poetry依赖包管理

zsh
# poetry add 安装依赖包 ## 安装最新版本的requests poetry add requests poetry add requests@2.30 # 精确锁死 2.30(不会自动更新到 2.31/2.32),poetry update无法升级 poetry add requests@^2.30 # 允许 2.x 的所有更新(直到 <3.0) poetry add requests@~2.30 # 允许 2.30.x 更新,但不能到 2.31 poetry add requests@>=2.30,<3.0 # 手工指定范围(等价于 ^2.30) ## 指定为开发依赖,会写到pyproject.toml中的[tool.poetry.dependencies]区域 poetry add pytest --dev # poetry install 安装pyproject.toml文件中的依赖 ## 安装pyproject.toml文件中的全部依赖 poetry install ## 仅安装非development环境的依赖,一般部署时使用 poetry install --no-dev ## 更新所有锁定版本的依赖包(慎用):开发时用 update,线上部署用 install(保证可复现环境) poetry update ## 更新指定依赖包 poetry update numpy ## 卸载依赖包 poetry remove numpy ## 查看可以更新的依赖 poetry show --outdated ## 查看项目安装的依赖 poetry show ## 以树形结构查看项目安装的依赖关系 poetry show --tree

Poetry 项目构建及发布

 本次上传,选择TestPYPi进行测试项目的构建与发布,在此之前需提前注册好账号并创建 API Token。

zsh
## 项目打包 poetry build ## 在本地配置 Poetry 使用这个API Token,写入当前项目目录下的本地配置文件,不会影响其他项目,也不会写入全局用户配置。 poetry config pypi-token.testpypi <你的token> --local ## 发布项目打包文件 poetry publish -r testpypi

注意

  1. 项目名称必须在TestPypi上是唯一的,否则上传失败报错:
zsh
HTTP Error 403: Forbidden | b"<html>\n <head>\n <title>403 The user 'LB6666' isn't allowed to upload to project 'poetry-demo'.
  1. 目前发布只能通过API Token,如果通过账号与密码的话会提示:
zsh
Username/Password authentication is no longer supported. Migrate to API Tokens or Trusted Publishers instead

参考文章

Python依赖管理及打包利器-Poetry
poetry官方文档

本文作者:精卫

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!