跳转到主要内容

Python依赖管理和打包变得简单。

项目描述

Poetry: Python的依赖管理

Poetry build status

Poetry帮助您声明、管理和安装Python项目的依赖项,确保您在各个地方都有正确的堆栈。

Poetry Install

它支持Python 2.7和3.4+。

安装

Poetry提供了一个自定义安装程序,该程序将通过供应商化其依赖项来安装poetry,从而将其从系统其他部分隔离开来。这是安装poetry的推荐方法。

curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

或者,您可以下载get-poetry.py文件并单独执行它。

如果您想安装预发布版本,可以通过将--preview传递给get-poetry.py来执行此操作

python get-poetry.py --preview

同样,如果您想安装特定版本,可以使用--version

python get-poetry.py --version 0.7.0

使用pip安装poetry也是可能的。

pip install --user poetry

但是请注意,它还将安装poetry的依赖项,这可能会导致冲突。

更新poetry

将poetry更新到最新稳定版本只需调用self:update命令即可。

poetry self:update

如果您想安装预发布版本,可以使用--preview选项。

poetry self:update --preview

最后,如果您想安装特定版本,可以将它作为self:update参数传递。

poetry self:update 0.8.0

为Bash、Fish或Zsh启用Tab补全

poetry 支持 Bash、Fish 和 Zsh 的完成脚本生成。有关详细信息,请参阅 poetry help completions,但大致步骤如下:

# Bash
poetry completions bash > /etc/bash_completion.d/poetry.bash-completion

# Bash (macOS/Homebrew)
poetry completions bash > $(brew --prefix)/etc/bash_completion.d/poetry.bash-completion

# Fish
poetry completions fish > ~/.config/fish/completions/poetry.fish

# Zsh
poetry completions zsh > ~/.zfunc/_poetry

注意:您可能需要重新启动 shell 以使更改生效。

对于 zsh,您必须在 ~/.zshrc 中在 compinit 之前添加以下行:

fpath+=~/.zfunc

简介

poetry 是一个用于处理依赖项安装、构建和打包 Python 包的工具。它只需要一个文件就能完成所有这些工作:新的、标准化的 pyproject.toml 文件。

换句话说,poetry 使用 pyproject.toml 来替换 setup.pyrequirements.txtsetup.cfgMANIFEST.in 和新增加的 Pipfile

[tool.poetry]
name = "my-package"
version = "0.1.0"
description = "The description of the package"

license = "MIT"

authors = [
    "Sébastien Eustace <sebastien@eustace.io>"
]

readme = 'README.md'  # Markdown files are supported

repository = "https://github.com/sdispater/poetry"
homepage = "https://github.com/sdispater/poetry"

keywords = ['packaging', 'poetry']

[tool.poetry.dependencies]
python = "~2.7 || ^3.2"  # Compatible python versions must be declared here
toml = "^0.9"
# Dependencies with extras
requests = { version = "^2.13", extras = [ "security" ] }
# Python specific dependencies with prereleases allowed
pathlib2 = { version = "^2.2", python = "~2.7", allows-prereleases = true }
# Git dependencies
cleo = { git = "https://github.com/sdispater/cleo.git", branch = "master" }

# Optional dependencies (extras)
pendulum = { version = "^1.4", optional = true }

[tool.poetry.dev-dependencies]
pytest = "^3.0"
pytest-cov = "^2.4"

[tool.poetry.scripts]
my-script = 'my_package:main'

以下是一些我们可以注意到的事情:

  • 它将尝试强制执行 语义版本控制 作为版本命名的最佳实践。
  • 您可以指定说明文件、包含和排除的文件:不再需要 MANIFEST.in。poetry 还将使用 VCS 忽略文件(如 .gitignore)来填充 exclude 部分。
  • 可以指定关键字(最多 5 个),并将作为包装站点的标签。
  • 依赖项部分支持 caret、tilde、通配符、不等式和多个要求。
  • 您必须指定您的包兼容的 Python 版本。

poetry 还会检测您是否在虚拟环境中,并相应地安装包。因此,poetry 可以全局安装并在任何地方使用。

poetry 还附带了一个完整的依赖关系解析库,灵感来自 Molinillo

为什么?

Python 的打包系统和依赖关系管理相当复杂,对于新手来说难以理解。即使是经验丰富的开发者,有时也可能难以创建 Python 项目中需要的所有文件:setup.pyrequirements.txtsetup.cfgMANIFEST.in 和新增加的 Pipfile

所以我想要一个工具,将所有东西都限制在一个配置文件中:依赖关系管理、打包和发布。

它从其他语言中存在的工具中汲取灵感,如 composer(PHP)或 cargo(Rust)。

最后,没有可靠的工具可以在 Python 中正确解析依赖关系,因此我开始编写 poetry 以将完整的依赖关系解析器带给 Python 社区。

关于 Pipenv 呢?

简而言之:我不喜欢它提供的 CLI 或某些决策,我认为我们可以创建一个更好、更直观的 CLI。以下是我不喜欢的一些事情。

依赖关系解析

依赖关系解析是随机的,即使有解决方案也会失败。让我们举一个例子

pipenv install oslo.utils==1.4.0

将失败并出现此错误

Could not find a version that matches pbr!=0.7,!=2.1.0,<1.0,>=0.6,>=2.0.0

而 Poetry 将为您找到正确的包集

poetry add oslo.utils=1.4.0

结果如下:

  - Installing pytz (2018.3)
  - Installing netifaces (0.10.6)
  - Installing netaddr (0.7.19)
  - Installing oslo.i18n (2.1.0)
  - Installing iso8601 (0.1.12)
  - Installing six (1.11.0)
  - Installing babel (2.5.3)
  - Installing pbr (0.11.1)
  - Installing oslo.utils (1.4.0)

这是由于 Poetry 内核的依赖关系解析器效率高而得以实现的。

以下是这里具体发生的事情的分解:

oslo.utils (1.4.0) 依赖于

  • pbr (>=0.6,!=0.7,<1.0)
  • Babel (>=1.3)
  • six (>=1.9.0)
  • iso8601 (>=0.1.9)
  • oslo.i18n (>=1.3.0)
  • netaddr (>=0.7.12)
  • netifaces (>=0.10.4)

我们感兴趣的是 pbr (>=0.6,!=0.7,<1.0)

此时,poetry 将选择 pbr==0.11.1,这是符合约束条件的最新版本。

接下来,它将尝试选择 oslo.i18n==3.20.0,这是符合 oslo.i18n (>=1.3.0) 的最新版本。

然而,这个版本需要 pbr (!=2.1.0,>=2.0.0),这与 pbr==0.11.1 不兼容,因此 poetry 将尝试找到满足 pbr (>=0.6,!=0.7,<1.0)oslo.i18n 版本。

通过分析 oslo.i18n 的版本,它会找到 oslo.i18n==2.1.0,该版本需要 pbr (>=0.11,<2.0)。此时,解析过程变得简单,因为没有更多的冲突。

安装命令

当您将包指定给 install 命令时,它将将其添加为通配符依赖项。这意味着可以安装此包的任何版本,这可能会导致兼容性问题。

此外,您必须明确告诉它,当您安装新包时不要更新已锁定的包。这应该是默认设置。

删除命令

remove 命令将仅删除指定的包,但如果它们不再需要,则不会删除其依赖项。

您必须使用 syncclean 来修复这个问题。

范围太有限

最后,Pipfile 只是从 requirements.txt 的替代品,最终,您仍然需要将与 Pipfile 中声明的完全相同的依赖项填充到您的 setup.py 文件(或 setup.cfg)中。因此,最终您仍然需要管理一些配置文件来正确设置项目。

命令

new

此命令将帮助您启动新的 Python 项目,创建适合大多数项目的目录结构。

poetry new my-package

将创建以下文件夹

my-package
├── pyproject.toml
├── README.rst
├── my_package
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_my_package

如果您想将项目命名为与文件夹不同的名称,可以传递 --name 选项

poetry new my-folder --name my-package

init

此命令将帮助您通过提示您提供有关包的基本信息来交互式地创建 pyproject.toml 文件。

它将交互式地要求您填写字段,同时使用一些智能默认值。

poetry init

选项

  • --name:包的名称。
  • --description:包的描述。
  • --author:包的作者。
  • --dependency:具有版本约束的所需包。应采用格式 foo:1.0.0
  • --dev-dependency:开发需求,请参阅 --require

install

install 命令从当前目录读取 pyproject.toml 文件,解决依赖项,并安装它们。

poetry install

如果当前目录中存在 pyproject.lock 文件,它将使用那里的确切版本,而不是解决它们。这确保了使用库的每个人都将获得依赖项的相同版本。

如果没有 pyproject.lock 文件,Poetry 将在解决依赖项后创建一个。

您可以通过传递 --no-dev 选项来指定不安装开发依赖项。

poetry install --no-dev

您还可以通过传递 --E|--extras 选项来指定要安装的额外功能(允许多个值)

poetry install --extras "mysql pgsql"
poetry install -E mysql -E pgsql

选项

  • --no-dev:不安装开发依赖项。
  • -E|--extras:要安装的功能(允许多个值)。

update

为了获取依赖项的最新版本并更新 pyproject.lock 文件,您应该使用 update 命令。

poetry update

这将解决项目的所有依赖项,并将确切版本写入 pyproject.lock

如果您只想更新几个包而不是所有包,可以按如下方式列出

poetry update requests toml

选项

  • --dry-run:输出操作但不会执行任何操作(隐式启用 --verbose)。

add

add 命令将所需包添加到您的 pyproject.toml 并安装它们。

如果您未指定版本约束,Poetry 将根据可用的包版本选择一个合适的版本。

poetry add requests pendulum

选项

  • --D|dev:将包作为开发依赖项添加。
  • --optional:将其作为可选依赖项添加。
  • --dry-run:输出操作但不会执行任何操作(隐式启用 --verbose)。

remove

remove 命令从当前安装包列表中删除包

poetry remove pendulum

选项

  • --D|dev:从开发依赖项中删除包。
  • --dry-run:输出操作但不会执行任何操作(隐式启用 --verbose)。

show

要列出所有可用的包,您可以使用 show 命令。

poetry show

如果您想查看某个包的详细信息,您可以传递包名。

poetry show pendulum

name        : pendulum
version     : 1.4.2
description : Python datetimes made easy

dependencies:
 - python-dateutil >=2.6.1
 - tzlocal >=1.4
 - pytzdata >=2017.2.2

选项

  • --tree:以树形结构列出依赖项。
  • -l|--latest:显示最新版本。
  • -o|--outdated:显示最新版本,但仅限于过时的包。

build

build 命令构建源代码和 wheels 存档。

poetry build

注意,目前仅支持纯 Python wheels。

选项

  • -F|--format:限制格式为 wheel 或 sdist。

publish

此命令(如果尚未构建)构建并发布包到远程仓库。

如果是首次提交,它将自动注册包。

poetry publish

选项

  • -r|--repository:将包注册到的仓库(默认:pypi)。应与 config 命令设置的仓库名称匹配。
  • --username (-u):访问仓库的用户名。
  • --password (-p):访问仓库的密码。

config

config 命令允许您编辑 poetry 配置设置和仓库。

poetry config --list

用法

poetry config [options] [setting-key] [setting-value1] ... [setting-valueN]

setting-key 是配置选项名称,setting-value1 是配置值。

修改仓库

除了修改配置部分外,config 命令还支持使用以下方式修改仓库部分

poetry config repositories.foo https://foo.bar/simple/

这将设置仓库 foo 的 URL 为 https://foo.bar/simple/

如果您想为特定仓库存储凭据,可以轻松完成

poetry config http-basic.foo username password

如果您没有指定密码,系统会提示您输入。

选项

  • --unset:删除名为 setting-key 的配置元素。
  • --list:显示当前配置变量的列表。

search

此命令在远程索引中搜索包。

poetry search requests pendulum

选项

  • -N|--only-name:仅在名称中搜索。

lock

此命令锁定(不安装)pyproject.toml 中指定的依赖项。

poetry lock

pyproject.toml 文件

pyproject.toml 文件中的 tool.poetry 部分由多个部分组成。

name

包的名称。必需

version

包的版本。必需

这应遵循 语义版本控制。但是,它将不会强制执行,您可以自由遵循其他规范。

description

包的简要描述。必需

license

包的许可证。

最常见许可证的推荐表示法(按字母顺序)

  • Apache-2.0
  • BSD-2-Clause
  • BSD-3-Clause
  • BSD-4-Clause
  • GPL-2.0
  • GPL-2.0+
  • GPL-3.0
  • GPL-3.0+
  • LGPL-2.1
  • LGPL-2.1+
  • LGPL-3.0
  • LGPL-3.0+
  • MIT

可选,但强烈建议提供。更多信息请参阅 SPDX 开源许可证注册处

authors

包的作者。这是一个作者列表,至少应包含一个作者。

作者必须采用 name <email> 的形式。

readme

包的 README 文件。必需

该文件可以是 README.rstREADME.md

homepage

项目网站的 URL。可选

repository

项目仓库的 URL。可选

documentation

项目文档的 URL。可选

keywords

与包相关的一组关键词(最多 5 个)。可选

include and exclude

一组模式,这些模式将被包含在最终的包中。

您可以向 Poetry 明确指定哪些 glob 应该被忽略或包含,以用于打包目的。exclude 字段中指定的 glob 识别了一组在构建包时不会被包含的文件。

如果包正在使用版本控制系统,exclude 字段将使用版本控制系统的 ignore 设置(例如,git 的 .gitignore)。

[tool.poetry]
# ...
include = ["package/**/*.py", "package/**/.c"]
exclude = ["package/excluded.py"]

dependenciesdev-dependencies

默认情况下,Poetry 配置为在 PyPi(https://pypi.ac.cn)上查找依赖项。在这种情况下,只需要名称和版本字符串。

[tool.poetry.dependencies]
requests = "^2.13.0"

如果您想使用私有仓库,可以将其添加到您的 pyproject.toml 文件中,如下所示

[[tool.poetry.source]]
name = 'private'
url = 'http://example.com/simple'

请注意,声明您的包兼容的 Python 版本是强制性的

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

波浪号要求

波浪号要求 允许指定版本的 SemVer 兼容更新。如果新版本号没有修改主、次、补丁分组中最左侧的非零数字,则允许更新。在这种情况下,如果我们运行 poetry update requests,如果可用,Poetry 会更新到版本 2.14.0,但不会更新到 3.0.0。如果我们将版本字符串指定为 ^0.1.13,Poetry 会更新到 0.1.14,但不会更新到 0.2.00.0.x 不被认为与任何其他版本兼容。

以下是一些波浪号要求的示例以及它们允许的版本

^1.2.3 := >=1.2.3 <2.0.0
^1.2 := >=1.2.0 <2.0.0
^1 := >=1.0.0 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4
^0.0 := >=0.0.0 <0.1.0
^0 := >=0.0.0 <1.0.0

波浪号要求

波浪号要求 指定一个最小版本,并具有一定的更新能力。如果您指定了主、次和补丁版本,或者只指定了主和次版本,则只允许补丁级别的更改。如果您只指定了主版本,则允许次级和补丁级别的更改。

~1.2.3 是一个波浪号要求的示例。

~1.2.3 := >=1.2.3 <1.3.0
~1.2 := >=1.2.0 <1.3.0
~1 := >=1.0.0 <2.0.0

通配符要求

通配符要求 允许在通配符所在的位置使用任何版本。

*1.*1.2.* 是通配符要求的示例。

* := >=0.0.0
1.* := >=1.0.0 <2.0.0
1.2.* := >=1.2.0 <1.3.0

不等式要求

不等式要求 允许手动指定一个依赖的版本范围或精确版本。

以下是不等式要求的示例

>= 1.2.0
> 1
< 2
!= 1.2.3

多个要求

多个版本要求也可以用逗号分隔,例如 >= 1.2, < 1.5

git 依赖项

要依赖位于 git 仓库中的库,您需要指定包含 git 键的仓库位置的最小信息

[tool.poetry.dependencies]
requests = { git = "https://github.com/requests/requests.git" }

由于我们没有指定其他任何信息,所以 Poetry 假设我们打算使用 master 分支上的最新提交来构建我们的项目。您可以将 git 键与 revtagbranch 键结合使用来指定其他内容。以下是一个指定您想使用名为 next 的分支上的最新提交的示例

[tool.poetry.dependencies]
requests = { git = "https://github.com/kennethreitz/requests.git", branch = "next" }

Python 受限依赖项

您还可以指定依赖项仅适用于特定的 Python 版本

[tool.poetry.dependencies]
pathlib2 = { version = "^2.2", python = "~2.7" }
[tool.poetry.dependencies]
pathlib2 = { version = "^2.2", python = ["~2.7", "^3.2"] }

脚本

本节描述了在安装包时将安装的脚本或可执行文件

[tool.poetry.scripts]
poetry = 'poetry.console:run'

安装了上述 toml 文件中的包后,poetry 将成为全局命令,可通过命令行使用,它将在 poetry 包中执行 console.run

额外功能

Poetry 支持额外功能,允许表达

  • 可选依赖项,这些依赖项增强了一个包,但不是必需的;以及
  • 可选依赖项的集群。
[tool.poetry]
name = "awesome"

[tool.poetry.dependencies]
# These packages are mandatory and form the core of this package’s distribution.
mandatory = "^1.0"

# A list of all of the optional dependencies, some of which are included in the
# below `extras`. They can be opted into by apps.
psycopg2 = { version = "^2.7", optional = true }
mysqlclient = { version = "^1.3", optional = true }

[tool.poetry.extras]
mysql = ["mysqlclient"]
pgsql = ["psycopg2"]

在安装包时,您可以使用 -E|--extras 选项指定额外功能

poetry install --extras "mysql pgsql"
poetry install -E mysql -E pgsql

插件

Poetry 支持任意插件,它们的工作方式类似于 setuptools entry points。为了匹配 setuptools 文档中的示例,您将使用以下内容

[tool.poetry.plugins] # Optional super table

[tool.poetry.plugins."blogtool.parsers"]
".rst" = "some_module::SomeClass"

资源

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

poetry-plus-0.11.4.tar.gz (130.3 kB 查看哈希值)

上传时间

构建分发

poetry_plus-0.11.4-py2.py3-none-any.whl (551.2 kB 查看哈希值)

上传时间 Python 2 Python 3

支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面