Pip pyproject.toml:可选依赖项组是否需要其他可选依赖项组?

Jam*_*mes 14 python pip toml python-packaging pyproject.toml

我正在使用最新版本的 pip 23.01,. 我有一个pyproject.toml包含依赖项和可选依赖项组(又名“额外”)的文件。为了避免冗余并使管理可选依赖项组更容易,我想知道如何让可选依赖项组需要其他可选依赖项组。

我有一个pyproject.toml可选依赖项组在依赖项中有冗余重叠的情况。我想他们可以用“等级制”来形容。它看起来像这样:

[project]
name = 'my-package'
dependencies = [
    'pandas',
    'numpy>=1.22.0',
    # ...
]

[project.optional-dependencies]
# development dependency groups
test = [
    'my-package[chem]',
    'pytest>=4.6',
    'pytest-cov',
    # ...
    # Redundant overlap with chem and torch dependencies
    'rdkit',
    # ...
    'torch>=1.9',
    # ...
]

# feature dependency groups
chem = [
    'rdkit',
    # ...
    # Redundant overlap with torch dependencies
    'torch>=1.9',
    # ...

]
torch = [
    'torch>=1.9',
    # ...
]
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,pip install .[test]将包含所有chemtorch组的包,并将pip install .[chem]包含torch组的包。

删除从一个组到另一个组的重叠和引用,用户仍然可以chem通过执行 来获取所需的包pip install .[chem,torch],但我与数据科学家一起工作,他们可能不会立即意识到该torch组是该组的要求chem等。

因此,我想要一个类似这样的文件:

[project]
name = 'my-package'
dependencies = [
    'pandas',
    'numpy>=1.22.0',
    # ...
]

[project.optional-dependencies]
# development dependency groups
test = [
    'my-package[chem]',
    'pytest>=4.6',
    'pytest-cov',
    # ...
]

# feature dependency groups
chem = [
    'my-package[torch]',
    'rdkit',
    # ...
]
torch = [
    'torch>=1.9',
    # ...
]
Run Code Online (Sandbox Code Playgroud)

这种方法不起作用,因为my-package托管在我们的私有 pip 存储库中,因此'my-package[chem]'像上面的示例一样会获取先前构建的版本的chem组包。

看来使用 Poetry 及其pyproject.toml格式/功能可以使这成为可能,但我不希望对我们的构建系统进行太多切换。这可以用 pip 实现吗?

Oma*_* S. 7

也许值得将 2 个依赖项组绑定到一个组中,看看是否可以解决问题,如“全部”中所示

[project]
name = "foo"
version = "0.1.0"

[project.optional-dependencies]
socks = ["pysocks"]
jwt = ["pyjwt"]
all = ["foo[socks,jwt]"]
Run Code Online (Sandbox Code Playgroud)