如何在Poetry和pyproject.toml中将库的可选依赖项添加为“extra”?

9
我可以为您进行翻译。以下是您需要翻译的内容:

我正在使用 pyprojectpoetry 构建 Python 包。我的 pyproject.toml 如下所示:

[tool.poetry]
authors = ["test"]
description = ""
name = "test"
version = "0.1.0"

[tool.poetry.dependencies]
spacy = {extras = ["cuda113"], version = "^3.2.3"}
faiss-gpu = {version = "1.7.2", optional = true}

[tool.poetry.extras]
gpu = ["faiss-gpu"]

使用 poetry install -E gpu 安装faiss-gpu 可以成功。

然而,我希望只有在提供 poetry install -E gpu 命令时才安装spacy[cuda113](GPU 版本),而普通的 poetry install 应该只安装spacy(CPU 版本)。

我尝试使用以下配置,但这使得所有的spacy都成为可选项,并且不安装它。只有spacy[cuda113](GPU 版本)必须是可选的。

[tool.poetry]
authors = ["test"]
description = ""
name = "test"
version = "0.1.0"

[tool.poetry.dependencies]
spacy = {extras = ["cuda113"], version = "^3.2.3", optional = true}
faiss-gpu = {version = "1.7.2", optional = true}

[tool.poetry.extras]
gpu = ["faiss-gpu", "spacy"]

有没有一种方法使 spacy[cuda113] 成为可选项,但要求使用 spacy 作为必需依赖项?
1个回答

1
尝试这样做:
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.poetry]
authors = ["test"]
description = ""
name = "test"
version = "0.1.0"

[tool.poetry.dependencies]
python = "^3.10"
faiss-gpu = {version = "1.7.2", optional = true}
spacy = {extras = ["cuda113"], version = "^3.2.3", optional = true}
Spacy = "^3.2.3"

[tool.poetry.extras]
gpu = ["faiss-gpu", "spacy"]

它生成的dist-info METADATA行如下,关于pip如何安装test和test[gpu],看起来是正确的:
Metadata-Version: 2.1
Name: test
Version: 0.1.0
Summary: 
Author: test
Requires-Python: >=3.10,<4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Provides-Extra: gpu
Requires-Dist: Spacy (>=3.2.3,<4.0.0)
Requires-Dist: faiss-gpu (==1.7.2); extra == "gpu"
Requires-Dist: spacy[cuda113] (>=3.2.3,<4.0.0); extra == "gpu"

免责声明: 我认为我依靠poetry中的bug和/或实现细节来使其工作。请注意依赖项规范中"spacy"和"Spacy"之间的大小写差异。行的顺序也至关重要。


嗨@wim。感谢您的回答,但这并不是完全的解决方案。您的解决方案存在问题,即“Spacy”和“spacy[cuda113]”都作为额外的GPU依赖项安装。正如我在问题中所述,“普通诗歌安装应该只安装spacy(CPU版本)。”因此,我希望基本的spacy库不是额外的,并且始终被安装。 - azizbro
你能提供一些关于使用大写字母指定库(例如“Spacy”)时会发生什么的文档吗? - azizbro
@azizbro 我认为你对extras的工作原理有一些误解 - 安装"Spacy"和"spacy[cuda113]"之间没有区别,与仅安装"spacy[cuda113]"相比。Extras只能添加依赖项。在这种情况下,它添加了cupy-cuda113的依赖项。大写字母只是为了欺骗TOML加载器将Spacy和spacy视为唯一键 - 否则,按照poetry期望的格式的文件由于映射中的重复键而不是有效的TOML。 - wim
@vim,非常感谢您的回答,但是使用您的设置,如果我运行poetry install -E gpu,只会安装普通的spacy版本,无法满足要求。 - azizbro
2
@azizbro 它确实有效。我已经在两台不同的机器上测试并验证了这个(Python 3.10 + poetry 1.1.13和Python 3.8 + poetry 1.1.11)。请参见https://replit.com/@wimglenn/ExampleSpacyGPU#pyproject.toml - 创建一个新环境,删除锁定文件,然后运行poetry install -E gpu,它会拉取cupy-cuda113(请在shell选项卡中检查pip freeze)。唯一的方法是通过spacy的gpu extra安装cupy-cuda113 - wim
@vim 感谢您提供replit。它似乎确实有效,所以谢谢!由于答案依赖于诗歌未明确说明的实现细节,我会等到他们有一个适当的功能来处理这个问题。 - azizbro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接