当您的 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。
要在命令行中使用 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.
安装 Poetry 后,是时候看看 Poetry 是如何工作的了。在本节中,您将学习如何开始一个新的 Poetry 项目以及如何将 Poetry 添加到现有项目中。您还将看到项目结构并检查 pyproject.toml 文件。
您可以使用 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 文件。
使用 Poetry 最重要的文件之一是 pyproject.toml 文件。这个文件不是 Poetry 的发明。这是 PEP 518 中定义的配置文件标准:
此 PEP 指定 Python 软件包应如何指定它们具有的构建依赖项以执行其选择的构建系统。作为本规范的一部分,为软件包引入了一个新的配置文件,用于指定它们的构建依赖项(期望相同的配置文件将用于未来的配置细节)。(来源)
作者考虑了上面引用中提到的“新配置文件”的几种文件格式。最后,他们决定采用 TOML 格式,即 Tom's Obvious Minimal Language 的缩写。在他们看来,TOML