写点什么

使用 Python Poetry 进行依赖管理

  • 2021 年 12 月 23 日
  • 本文字数:11441 字

    阅读完需:约 38 分钟

摘要:在本教程中,您探索了如何创建新的 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 文件,也可以在下方选择您的操作系统以使用相应的命令:

  • 视窗

  • Linux + macOS


PS C:\> (Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py -UseBasicParsing).Content | 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"1112[tool.poetry.dev-dependencies]13pytest = "^5.2"1415[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 <email>


第[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/virtualenvsUsing 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 lockUpdating dependenciesResolving 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-updateResolving 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 bs4Traceback (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 installInstalling 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-helloVersion [0.1.0]:Description []: My Hello World ExampleAuthor [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] noWould you like to define your development dependencies interactively? (yes/no) [yes] noGenerated 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.pyCreating virtualenv rp-simple-UCsI2-py3.9 in ~/Library/Caches/pypoetry/virtualenvsHello World!
复制代码


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

使用现有 requirements.txt 文件


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


$ cat requirements.txtbeautifulsoup4==4.9.3certifi==2020.12.5chardet==4.0.0idna==2.10requests==2.25.1soupsieve==2.2.1urllib3==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 dependenciesResolving 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 存储库中的文件时,您还要确保项目中的所有其他开发人员在他们的机器上安装相同的依赖项版本。


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

发布于: 1 小时前阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
使用 Python Poetry 进行依赖管理