使用 Python Poetry 进行依赖管理

2,555 阅读8分钟

摘要:在本教程中,您探索了如何创建新的 Python Poetry 项目以及如何将 Poetry 添加到现有项目中。

本文分享自华为云社区《使用 Python Poetry 进行依赖管理》,作者: Yuchuan。

当您的 Python 项目依赖于外部包时,您需要确保使用每个包的正确版本。更新后,软件包可能无法像更新前那样工作。Python Poetry 之类的依赖项管理器可帮助您指定、安装和解析项目中的外部包。通过这种方式,您可以确保始终在每台机器上使用正确的依赖版本。

使用Poetry将帮助您启动新项目、维护现有项目并掌握依赖项管理。您将准备好使用pyproject.toml文件,这将是在 Python 项目中定义构建需求的标准。

要完成本教程并充分利用它,您应该对虚拟环境、模块和包以及pip.

虽然本教程侧重于依赖项管理,但 Poetry 还可以帮助您构建和打包项目。如果您想分享您的工作,那么您甚至可以将您的 Poetry 项目发布到Python Packaging Index (PyPI)。

注意先决条件

在深入研究 Python Poetry 的细节之前,您需要了解一些先决条件。首先,您将阅读本教程中将遇到的术语的简短概述。接下来,您将安装 Poetry 本身。

相关术语

如果您曾经import在 Python 脚本中使用过语句,那么您就已经使用过modules。其中一些模块可能是您自己编写的 Python 文件。其他可能是内置模块,例如datetime。但是,有时 Python 提供的还不够。那时您可能会转向外部的打包模块。当您的 Python 代码依赖于外部模块时,您可以说这些是您项目的依赖项。

您可以在PyPI 中找到不属于Python 标准库的包。在了解其工作原理之前,您需要在系统上安装 Poetry。

Python Poetry安装

要在命令行中使用 Poetry,您应该在系统范围内安装它。如果您只是想尝试一下,那么您可以使用pip. 但是您应该谨慎尝试这种方法,因为 Poetry 将安装自己的依赖项,这可能会与您在项目中使用的其他包冲突。

安装 Poetry的推荐方法是使用官方install-poetry脚本。您可以手动下载并运行此Python 文件,也可以在下方选择您的操作系统以使用相应的命令:

如果您使用的是 Windows,那么您可以使用Invoke-Webrequest带有-UseBasicParsing选项的cmdlet将请求的 URL 的内容下载到标准输出流 (stdout)。随着管道字符(|),你移交输出到**标准输入流(标准输入)**的python。在这种情况下,您将的内容通过管道install-poetry.py传输到 Python 解释器。

**注意:**有些用户在 Windows 10 上使用 PowerShell 命令时会报告错误。

在输出中,您应该看到安装完成的消息。您可以poetry --version在终端中运行以查看是否poetry有效。此命令将显示您当前的 Poetry 版本。如果要更新 Poetry,则可以运行poetry self update.

Python Poetry入门

安装 Poetry 后,是时候看看 Poetry 是如何工作的了。在本节中,您将学习如何开始一个新的 Poetry 项目以及如何将 Poetry 添加到现有项目中。您还将看到项目结构并检查pyproject.toml文件。

创建一个新的Poetry项目

您可以使用new命令和项目名称作为参数来创建新的 Poetry 项目。在本教程中,该项目称为rp-poetry. 创建项目,然后进入新创建的目录:

$ poetry new rp-poetry
$ cd rp-poetry

通过运行poetry new rp-poetry,您可以创建一个名为 的新文件夹rp-poetry/。当您查看文件夹内部时,您会看到一个结构:

rp-poetry/
│
├── rp_poetry/
│   └── __init__.py
│
├── tests/
│   ├── __init__.py
│   └── test_rp_poetry.py
│
├── README.rst
└── pyproject.toml

Poetry 会自动为您规范化包名。它将-项目名称中的破折号 ( ) 转换_为文件夹名称中的下划线 ( ) rp_poetry/。否则,Python 中将不允许使用该名称,因此您无法将其作为模块导入。为了更好地控制创建包名称,您可以使用该--name选项以不同于项目文件夹的方式命名:

$ poetry new rp-poetry --name realpoetry

如果您更喜欢将源代码存储在额外的src/父文件夹中,那么 Poetry 可以让您使用以下--src标志来遵守该约定:

$ poetry new --src rp-poetry
$ cd rp-poetry

通过添加--src标志,您创建了一个名为 的文件夹src/,其中包含您的rp_poetry/目录:

rp-poetry/
│
├── src/
│   │
│   └── rp_poetry/
│       └── __init__.py
│
├── tests/
│   ├── __init__.py
│   └── test_rp_poetry.py
│
├── README.rst
└── pyproject.toml

创建新的 Poetry 项目时,您将立即收到一个基本的文件夹结构。

检查项目结构

该rp_poetry/子文件夹本身是不是很壮观呢。在这个目录中,你会找到一个__init__.py包含你的包版本的文件:

# rp_poetry/__init__.py

__version__ = "0.1.0"

当您跳到tests/文件夹并打开 时test_rp_poetry.py,您会注意到它rp_poetry已经是可导入的:

# tests/test_rp_poetry.py

from rp_poetry import __version__

def test_version():
    assert __version__ == "0.1.0"

Poetry 还为该项目添加了第一个测试。该test_version()函数检查 的__version__变量是否rp_poetry/__init__.py包含预期的版本。但是,该__init__.py文件并不是您定义包版本的唯一位置。另一个位置是pyproject.toml文件。

使用pyproject.toml文件

使用 Poetry 最重要的文件之一是pyproject.toml文件。这个文件不是 Poetry 的发明。这是 PEP 518 中定义的配置文件标准:

此 PEP 指定 Python 软件包应如何指定它们具有的构建依赖项以执行其选择的构建系统。作为本规范的一部分,为软件包引入了一个新的配置文件,用于指定它们的构建依赖项(期望相同的配置文件将用于未来的配置细节)。(来源)

作者考虑了上面引用中提到的“新配置文件”的几种文件格式。最后,他们决定采用TOML格式,即Tom's Obvious Minimal Language 的缩写。在他们看来,TOML 足够灵活,比其他选项(YAML、JSON、CFG 或 INI)具有更好的可读性和更少的复杂性。要查看 TOML 的外观,请打开pyproject.toml文件:

 1# pyproject.toml
 2
 3[tool.poetry]
 4name = "rp-poetry"
 5version = "0.1.0"
 6description = ""
 7authors = ["Philipp <philipp@realpython.com>"]
 8
 9[tool.poetry.dependencies]
10python = "^3.9"
11
12[tool.poetry.dev-dependencies]
13pytest = "^5.2"
14
15[build-system]
16requires = ["poetry-core>=1.0.0"]
17build-backend = "poetry.core.masonry.api"

您可以在pyproject.toml文件中看到四个部分。这些部分称为。它们包含诸如 Poetry 之类的工具识别和用于依赖项管理构建例程的指令。

如果表名是特定于工具的,则必须以tool.为前缀。通过使用这样的子表,您可以为项目中的不同工具添加说明。在这种情况下,只有tool.poetry. 但是,你可能会看到这样的例子[tool.pytest.ini_options]为pytest在其他项目中。

在[tool.poetry]上面第 3 行的子表中,您可以存储有关您的 Poetry 项目的一般信息。您的可用键由 Poetry 定义。虽然有些键是可选的,但您必须指定四个键:

  1. name: 你的包名

  2. version: 包的版本,最好遵循语义版本控制

  3. description:您的包裹的简短描述

  4. authors: 作者列表,格式 name

第[tool.poetry.dependencies]9 行和[tool.poetry.dev-dependencies]第 12行的子表对于您的依赖项管理至关重要。在下一部分向 Poetry 项目添加依赖项时,您将了解有关这些子表的更多信息。现在,重要的是要认识到的包相关性和发展依赖之间的区别。

该pyproject.toml文件的最后一个表位于第[build-system]15 行。该表定义了 Poetry 和其他构建工具可以使用的数据,但由于它不是特定于工具的,因此它没有前缀。Poetry 创建了pyproject.toml具有两个键的文件:

  1. requires:构建包所需的依赖项列表,使此键成为必需

  2. build-backend:用于执行构建过程的 Python 对象

如果您想更多地了解pyproject.toml文件的这一部分,那么您可以通过阅读PEP 517 中的源代码树来了解更多信息。

当您使用 Poetry 开始一个新项目时,这就是pyproject.toml您开始的文件。随着时间的推移,您将添加有关您的包和您正在使用的工具的配置详细信息。随着 Python 项目的增长,您的pyproject.toml文件也会随之增长。对于子表[tool.poetry.dependencies]和[tool.poetry.dev-dependencies]. 在下一节中,您将了解如何扩展这些子表。

使用 Python Poetry

一旦你设置了一个 Poetry 项目,真正的工作就可以开始了。一旦 Poetry 到位,您就可以开始编码。在此过程中,您将了解 Poetry 如何为您提供虚拟环境并处理您的依赖项。

使用 Poetry 的虚拟环境

当您开始一个新的 Python 项目时,创建一个虚拟环境是一种很好的做法。否则,您可能会混淆来自不同项目的不同依赖项。使用虚拟环境是 Poetry 的核心功能之一,它永远不会干扰您的全局 Python 安装。

但是,Poetry 不会在您启动项目时立即创建虚拟环境。您可以通过让 Poetry 列出连接到当前项目的所有虚拟环境来确认 Poetry 尚未创建虚拟环境。如果你还没有,cd进入rp-poetry/然后运行一个命令:

$ poetry env list

目前,不应该有任何输出。

当您运行某些命令时,Poetry 会一路创建一个虚拟环境。如果您想更好地控制虚拟环境的创建,那么您可能决定明确告诉 Poetry 您要为其使用哪个 Python 版本,然后从那里开始:

$ poetry env use python3

使用此命令,您将使用与安装 Poetry 相同的 Python 版本。使用python3的作品,当你在你的Python可执行程序PATH。

**注意:**或者,您可以将绝对路径传递给 Python 可执行文件。它应该与您可以在pyproject.toml文件中找到的 Python 版本约束相匹配。如果没有,那么您可能会遇到麻烦,因为您使用的 Python 版本与项目所需的版本不同。在您的环境中运行的代码在另一台机器上可能有问题。

更糟糕的是,外部包通常依赖于特定的 Python 版本。因此,安装包的用户可能会收到错误消息,因为您的依赖项版本与其 Python 版本不兼容。

当你运行时env use,你会看到一条消息:

Creating virtualenv rp-poetry-AWdWY-py3.9 in ~/Library/Caches/pypoetry/virtualenvs
Using virtualenv: ~/Library/Caches/pypoetry/virtualenvs/rp-poetry-AWdWY-py3.9

如您所见,Poetry 为您的项目环境构建了一个唯一名称。该名称包含项目名称和 Python 版本。中间看似随机的字符串是您的父目录的哈希值。通过中间的这个唯一字符串,Poetry 可以处理系统上具有相同名称和相同 Python 版本的多个项目。这很重要,因为默认情况下,Poetry 在同一个文件夹中创建所有虚拟环境。

Poetry 无需任何其他配置,在virtualenvs/Poetry缓存目录的文件夹中创建虚拟环境:

如果要更改默认缓存目录,则可以编辑Poetry 的配置。当您已经在使用virtualenvwrapper或其他第三方工具来管理您的虚拟环境时,这会很有用。要查看当前配置,包括已配置的cache-dir,您可以运行以下命令:

$ poetry config --list

通常,您不必更改此路径。如果您想了解有关与 Poetry 的虚拟环境交互的更多信息,那么 Poetry 文档包含有关管理环境的一章。

只要您在项目文件夹中,Poetry 就会使用与之关联的虚拟环境。如果您有疑问,可以env list再次运行以下命令检查虚拟环境是否已激活:

$ poetry env list

这将显示类似rp-poetry-AWdWY-py3.9 (Activated). 有了激活的虚拟环境,您就可以开始管理一些依赖项并看到 Poetry 的魅力了。

声明你的依赖

Poetry 的一个关键元素是它对依赖项的处理。在开始之前,先看一下文件中的两个依赖表pyproject.toml:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

当前为您的项目声明了两个依赖项。一个是 Python 本身。另一个是pytest,一个广泛使用的测试框架。正如您之前看到的,您的项目包含一个tests/文件夹和一个test_rp_poetry.py文件。使用pytest作为依赖项,Poetry 可以在安装后立即运行您的测试。

**注意:**在编写本教程时,pytest使用Python 3.10运行Poetry不起作用。Poetry 安装了一个与 Python 3.10 不兼容的 pytest 版本。

Poetry 开发人员已经意识到这个问题,它将随着 Poetry 1.2 的发布而得到修复。

确保您在rp-poetry/项目文件夹中并运行命令:

$ poetry install

使用该install命令,Poetry 检查您的pyproject.toml文件中的依赖项,然后解析并安装它们。当您有许多依赖项需要使用不同版本的不同第三方包时,解析部分尤其重要。在安装任何包之前,Poetry 会确定哪个版本的包满足其他包设置为其要求的版本限制。

除了pytest它的要求之外,Poetry 还安装了项目本身。这样,您可以立即导入rp_poetry到您的测试中:

# tests/test_rp_poetry.py

from rp_poetry import __version__

def test_version():
    assert __version__ == "0.1.0"

安装项目包后,您可以导入rp_poetry测试并检查__version__字符串。随着pytest安装,您可以使用poetry run命令来执行测试:

 1$ poetry run pytest
 2========================= test session starts ==========================
 3platform darwin -- Python 3.9.1, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
 4rootdir: /Users/philipp/Real Python/rp-poetry
 5collected 1 item
 6
 7tests/test_rp_poetry.py .                                        [100%]
 8
 9========================== 1 passed in 0.01s ===========================

您当前的测试已成功运行,因此您可以放心地继续编码。但是,如果您仔细观察第 3 行,就会发现有些奇怪。它说pytest-5.4.3,5.2不像pyproject.toml文件中所说的那样。接得好!

回顾一下,文件中的pytest依赖项pyproject.toml如下所示:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dev-dependencies]
pytest = "^5.2"

^前面的插入符号 ( )5.2具有特定的含义,它是 Poetry 提供的版本约束之一。这意味着 Poetry 可以安装与版本字符串最左边的非零数字匹配的任何版本。这意味着5.4.3允许使用。版本6.0将不被允许。

当 Poetry 尝试解析依赖版本时,像插入符号这样的符号将变得很重要。如果只有两个要求,这并不太难。你声明的依赖越多,它就越复杂。让我们看看 Poetry 如何通过将新包安装到您的项目中来处理这个问题。

安装带有 Poetry 的包

您pip之前可能使用过安装不属于 Python 标准库的包。如果您pip install使用包名作为参数运行,则pip在Python Package Index上查找包。您可以以同样的方式使用 Poetry。

如果你想在requests你的项目中添加一个外部包,那么你可以运行一个命令:

$ poetry add requests

通过运行poetry add requests,您正在将最新版本的requests库添加到您的项目中。您可以使用版本约束,requests<=2.1或者requests==2.24如果您想更具体。当您不添加任何约束时,Poetry 将始终尝试安装最新版本的软件包。

有时,您只想在开发环境中使用某些包。使用pytest,您已经发现其中之一。另一种常见的库包括一个代码格式化像黑色,一个文档生成等斯芬克斯,和类似的一个静态分析工具pylint的,Flake8,mypy,或coverage.py。

要明确告诉 Poetry 一个包是一个开发依赖项,您可以poetry add使用该--dev选项运行。您还可以使用速记-D选项,它与以下内容相同--dev:

$ poetry add black -D

您添加requests为项目依赖项和black开发依赖项。Poetry 在后台为您做了一些事情。一方面,它将您声明的依赖项添加到pyproject.toml文件中:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.26.0"

[tool.poetry.dev-dependencies]
pytest = "^5.2"
black = "^21.9b0"

Poetry 将该requests包作为项目依赖项添加到tool.poetry.dependencies表中,同时将其black作为开发依赖项添加到tool.poetry.dev-dependencies.

区分项目依赖项和开发依赖项可以防止安装用户不需要运行程序的需求。开发依赖项仅与您的包的其他开发人员相关,他们希望pytest使用black. 当用户安装您的软件包时,他们只会安装requests它。

注意: 您可以更进一步并声明可选的依赖项。当您想让用户选择安装一个不需要但增强您的包的特定数据库适配器时,这会很方便。您可以在Poetry 文档 中了解有关可选依赖项的更多信息。

除了对pyproject.toml文件的更改之外,Poetry 还创建了一个名为poetry.lock. 在此文件中,Poetry 会跟踪您在项目中使用的所有包和确切版本。

处理 poetry.lock

当您运行该poetry add命令时,Poetry 会自动更新pyproject.toml并固定poetry.lock文件中的已解析版本。但是,您不必让 Poetry 完成所有工作。您可以手动向pyproject.toml文件添加依赖项并在之后锁定它们。

引脚依赖关系 poetry.lock

如果您想使用 Python 构建网络爬虫,那么您可能需要使用Beautiful Soup来解析您的数据。将其添加到文件中的tool.poetry.dependencies表中pyproject.toml:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.26.0"
beautifulsoup4 = "4.10.0"

通过添加beautifulsoup4 = "4.10.0",您告诉 Poetry 它应该完全安装这个版本。当您向pyproject.toml文件添加需求时,它尚未安装。只要poetry.lock你的项目中没有文件存在,你就可以poetry install在手动添加依赖后运行,因为 Poetry 会先查找poetry.lock文件。如果没有找到,Poetry 将解析pyproject.toml文件中列出的依赖项。

一旦poetry.lock文件存在,Poetry 将依赖该文件来安装依赖项。仅运行poetry install会触发警告,提示两个文件不同步并会产生错误,因为 Poetry 尚不知道beautifulsoup4项目中的任何版本。

要将pyproject.toml文件中手动添加的依赖项固定到poetry.lock,您必须首先运行以下poetry lock命令:

$ poetry lock
Updating dependencies
Resolving dependencies... (1.5s)

Writing lock file

通过运行poetry lock,Poetry 处理pyproject.toml文件中的所有依赖项并将它们锁定到poetry.lock文件中。诗歌并不止于此。运行时poetry lock,Poetry 还会递归遍历并锁定您的直接依赖项的所有依赖项。

**注意:**poetry lock如果有适合您的版本限制的新版本可用,该命令还会更新您现有的依赖项。如果您不想更新poetry.lock文件中已有的任何依赖项,则必须将--no-update选项添加到poetry lock命令中:

$ poetry lock --no-update
Resolving dependencies... (0.1s)

在这种情况下,Poetry 仅解析新的依赖项,但poetry.lock不会更改文件中的任何现有依赖项版本。

现在您已经固定了所有依赖项,是时候安装它们以便您可以在您的项目中使用它们。

安装依赖项 poetry.lock

如果您按照上一节中的步骤操作,那么您已经安装pytest并black使用了该poetry add命令。您还锁定了beautifulsoup4,但您还没有安装 Beautiful Soup。要验证beautifulsoup4尚未安装,请使用以下命令打开Python 解释器poetry run:

$ poetry run python3

执行poetry run python3将在 Poetry 的环境中打开一个交互式REPL会话。首先,尝试导入requests. 这应该完美无缺。然后尝试 importing bs4,这是 Beautiful Soup 的模块名称。这应该会引发错误,因为尚未安装 Beautiful Soup:

>>>
>>> import requests
>>> import bs4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'bs4'

正如预期的那样,您可以requests毫无困难地导入,并且bs4找不到模块。通过键入exit()并点击退出交互式 Python 解释器Enter。

使用poetry lock命令锁定依赖项后,您必须运行该poetry install命令,以便您可以在项目中实际使用它们:

$ poetry install
Installing dependencies from lock file

Package operations: 2 installs, 0 updates, 0 removals

  • Installing soupsieve (2.2.1)
  • Installing beautifulsoup4 (4.10.0)

Installing the current project: rp-poetry (0.1.0)

通过运行poetry install,Poetry 读取poetry.lock文件并安装其中声明的所有依赖项。现在,bs4已准备好在您的项目中使用。要对此进行测试,请输入poetry run python3并导入bs4Python 解释器:

>>>
>>> import bs4
>>> bs4.__version__
'4.10.0'

完美的!这次没有错误,并且您拥有您声明的确切版本。这意味着 Beautiful Soup 已正确固定在您的poetry.lock文件中,已安装在您的项目中,并且可以使用了。要列出项目中的可用包并检查它们的详细信息,您可以使用该show命令。当您使用--help标志运行它时,您将看到如何使用它:

$ poetry show --help

要检查包,您可以使用show包名称作为参数,也可以使用--tree选项将所有依赖项以树的形式列出。这将帮助您查看项目的嵌套需求。

更新依赖

为了更新您的依赖项,Poetry 根据两种情况提供了不同的选项:

  1. 更新版本约束内的依赖项。

  2. 更新版本约束之外的依赖项。

您可以在pyproject.toml文件中找到版本限制。当新版本的依赖项仍然满足您的版本限制时,您可以使用以下update命令:

$ poetry update

该update命令将在版本限制内更新所有包及其依赖项。之后,Poetry 将更新您的poetry.lock文件。

如果你想更新一个或多个特定的包,那么你可以将它们作为参数列出:

$ poetry update requests beautifulsoup4

使用此命令,Poetry 将搜索满足文件中列出的版本限制的新版本requests和新版本。然后它将解析您项目的所有依赖项并将版本固定到您的文件中。您的文件将保持不变,因为列出的约束仍然有效。beautifulsoup4pyproject.tomlpoetry.lockpyproject.toml

如果要使用比pyproject.toml文件中定义的版本更高的版本来更新依赖项,则需要pyproject.toml事先调整文件。另一种选择是add使用版本约束或latest标签运行命令:

$ poetry add pytest@latest --dev

当您运行add带有latest标记的命令时,它会查找包的最新版本并更新您的pyproject.toml文件。包含latest标签或版本约束对于使用该add命令至关重要。如果没有它,您会收到一条消息,表明该包已存在于您的项目中。另外,不要忘记--dev为开发依赖项添加标志。否则,您会将包添加到常规依赖项中。

添加新版本后,您必须运行install您在上一节中学到的命令。只有这样,您的更新才会被锁定到poetry.lock文件中。

如果您不确定更新会为您的依赖项引入哪些基于版本的更改,您可以使用该--dry-run标志。此标志适用于命令update和add命令。它在您的终端中显示操作而不执行任何操作。这样,您可以安全地发现版本更改并决定哪种更新方案最适合您。

区分pyproject.toml和poetry.lock

虽然pyproject.toml文件中的版本要求可能很宽松,但 Poetry 会锁定您在poetry.lock文件中实际使用的版本。这就是为什么在使用Git 时应该提交此文件的原因。通过poetry.lock在Git 存储库中提供文件,您可以确保所有开发人员都将使用所需软件包的相同版本。当您遇到包含poetry.lock文件的存储库时,最好使用 Poetry。

使用poetry.lock,您可以确保您使用的版本与其他开发人员使用的版本完全相同。如果其他开发人员不使用 Poetry,您可以将其添加到未使用 Poetry 设置的现有项目中。

将poetry添加到现有项目

很有可能,您的项目不是从poetry new命令开始的。或者,您可能继承了一个不是用 Poetry 创建的项目,但现在您想使用 Poetry 进行依赖管理。在这些类型的情况下,您可以将 Poetry 添加到现有的 Python 项目中。

添加pyproject.toml到脚本文件夹

如果您的项目只包含一些 Python 文件,那么您仍然可以添加 Poetry 作为未来构建的基础。在这个例子中,只有一个文件,hello.py:

# rp-hello/hello.py

print("Hello World!")

这个脚本唯一能做的就是输出字符串"Hello World!"。但也许这只是一个宏伟项目的开始,因此您决定将 Poetry 添加到您的项目中。poetry new您将使用以下poetry init命令,而不是使用之前的命令:

$ poetry init

This command will guide you through creating your pyproject.toml config.

Package name [rp-hello]: rp-hello
Version [0.1.0]:
Description []: My Hello World Example
Author [Philipp <philipp@realpython.com>, n to skip]:
License []:
Compatible Python versions [^3.9]:

Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file

该poetry init命令将启动交互式会话以创建pyproject.toml文件。 Poetry 为您提供了大多数需要设置的配置的建议,您可以按下Enter以使用它们。当您不声明任何依赖项时,pyproject.tomlPoetry 创建的文件如下所示:

# rp-hello/pyproject.toml

[tool.poetry]
name = "rp-hello"
version = "0.1.0"
description = "My Hello World Example"
authors = ["Philipp <philipp@realpython.com>"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

内容看起来与您在前几节中经历的示例相似。

现在您可以使用 Poetry 项目提供的所有命令。有了pyproject.toml文件,您现在可以运行脚本:

$ poetry run python3 hello.py
Creating virtualenv rp-simple-UCsI2-py3.9 in ~/Library/Caches/pypoetry/virtualenvs
Hello World!

因为 Poetry 没有找到任何可以使用的虚拟环境,所以它在执行您的脚本之前创建了一个新环境。执行此操作后,它会显示您的Hello World!消息而没有任何错误。这意味着您现在有一个正在运行的 Poetry 项目。

使用现有requirements.txt文件

有时您的项目已经有一个requirements.txt文件。看看requirements.txt这个Python 网络爬虫的文件:

$ cat requirements.txt
beautifulsoup4==4.9.3
certifi==2020.12.5
chardet==4.0.0
idna==2.10
requests==2.25.1
soupsieve==2.2.1
urllib3==1.26.4

使用该cat实用程序,您可以读取文件并将内容写入标准输出。在本例中,它显示了网络爬虫项目的依赖项。使用 创建 Poetry 项目后poetry init,您可以将该cat实用程序与以下poetry add命令结合使用:

$ poetry add `cat requirements.txt`
Creating virtualenv rp-require-0ubvZ-py3.9 in ~/Library/Caches/pypoetry/virtualenvs

Updating dependencies
Resolving dependencies... (6.2s)

Writing lock file

Package operations: 7 installs, 0 updates, 0 removals

  • Installing certifi (2020.12.5)
  • Installing chardet (4.0.0)
  • Installing idna (2.10)
  • Installing soupsieve (2.2.1)
  • Installing urllib3 (1.26.4)
  • Installing beautifulsoup4 (4.9.3)
  • Installing requests (2.25.1)

当需求文件像这样简单时,使用poetry add和cat可以为您节省一些手动工作。

requirements.txt然而,有时文件会更复杂一些。在这些情况下,您可以执行测试运行并查看结果,或者手动将需求添加到文件中的[tool.poetry.dependencies]表中pyproject.toml。要查看您的结构pyproject.toml是否有效,您可以在poetry check之后运行。

创建requirements.txt自poetry.lock

在某些情况下,您必须有一个requirements.txt文件。例如,也许您想在 Heroku 上托管您的 Django 项目。对于这种情况,Poetry 提供了export命令。如果你有一个 Poetry 项目,你可以requirements.txt从你的poetry.lock文件中创建一个文件:

$ poetry export --output requirements.txt

poetry export以这种方式使用该命令会创建一个requirements.txt包含散列和环境标记的文件。这意味着您可以确保处理与poetry.lock文件内容类似的非常严格的要求。如果您还想包含您的开发依赖项,您可以添加--dev到命令中。要查看所有可用选项,您可以选中poetry export --help。

命令参考

本教程向您介绍了 Poetry 的依赖管理。在此过程中,您使用了一些 Poetry 的命令行界面 (CLI) 命令:

您可以查看Poetry CLI 文档以了解有关上述命令和 Poetry 提供的其他命令的更多信息。您还可以poetry --help直接在终端中运行以查看信息!

结论

在本教程中,您探索了如何创建新的 Python Poetry 项目以及如何将 Poetry 添加到现有项目中。Poetry 的一个关键部分是pyproject.toml文件。与 结合使用poetry.lock,您可以确保安装项目所需的每个包的确切版本。当您跟踪poetry.lockGit 存储库中的文件时,您还要确保项目中的所有其他开发人员在他们的机器上安装相同的依赖项版本。

点击关注,第一时间了解华为云新鲜技术~