Python依赖管理和打包变得简单。
项目描述
Poetry: Python的依赖管理
Poetry帮助您声明、管理和安装Python项目的依赖项,确保您在各个地方都有正确的堆栈。
它支持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.py
、requirements.txt
、setup.cfg
、MANIFEST.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.py
、requirements.txt
、setup.cfg
、MANIFEST.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
命令将仅删除指定的包,但如果它们不再需要,则不会删除其依赖项。
您必须使用 sync
或 clean
来修复这个问题。
范围太有限
最后,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.rst
或 README.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"]
dependencies
和 dev-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.0
。 0.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
键与 rev
、tag
或 branch
键结合使用来指定其他内容。以下是一个指定您想使用名为 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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a996f3ad384e8d66310a2648c0d75a3cac4813a8b2ba6333d2fbe74910393f65 |
|
MD5 | aabfbfcce9d3f309ec2abf5f30f7eb8b |
|
BLAKE2b-256 | ba95fbd1122040b6ef1276b59f859e6595a328d925d4fa21c98b66419668fe82 |
poetry_plus-0.11.4-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 856c9c0d537cb8934ba60ed8d65696b4d8cb758614104011eaed35091d3924ac |
|
MD5 | 3bb70cde41345edc136edd18fa800e17 |
|
BLAKE2b-256 | 2115fd76a4864d06ff9b8b025ab2712fd4b2c98b965cce7f5733f466957b3941 |