将 conda 与标准 python 打包工具(例如,requirements.txt 或 pyproject.toml 文件)结合起来的最佳方法是什么?

Drp*_*ton 3 python pip conda pyproject.toml

我从事科学计算工作,我实际上被迫使用 conda 安装某些其他维护的软件包来完成我的工作。如果我想使用自己的包,我需要一种方法让它能够与 conda 依赖解算器和 pip 很好地配合。我想简单地使用conda install本地包并使用 conda 依赖项求解器,以便它与其他软件兼容。但是,我还希望能够以其他方式pip install打包和/或将其上传到 PYPI。

有没有办法开发与 conda 环境兼容的标准化 python 包(使用例如pyproject.toml和/或文件)?requirements.txt我已经搜索过,但没有找到关于如何做到这一点的明确处方。

对于 conda,还可以 在本地*.yml文件中指定所需的依赖项,但此选项与通过 pip 安装不兼容。人们必须同时维护文件*.ymlrequirements.txt文件中的依赖关系。这种重复导致手动维护并且容易出错。

请注意,condadevelop命令是由anaconda官方支持的,从表面上看它可以用来解决这个问题;然而,它 实际上已被弃用,并且在撰写本文时,Python 3.11 似乎不支持它。

Drp*_*ton 6

我拼凑出了一种*.yml完全放弃文件的方法。我将所有依赖项保存在一个requirements.txt文件中(以及所有开发要求 requirements-dev.txt)并使用 conda (或者更好的是mamba)来安装它们。最后,我使用 pip 来安装软件包本身。

以下是该项目的文件结构示例(受到这篇文章的启发):

Project/
|-- src/
|   |-- __init__.py
|   |-- main.py
|
|-- pyproject.toml
|-- requirements.txt
|-- requirements-dev.txt
Run Code Online (Sandbox Code Playgroud)

在 中的其他元数据中pyproject.toml,我们必须指定我们想要从 中动态读取需求requirements.txt,以及我们可能需要的任何其他可选依赖项(例如,requirements-dev.txt):

pyproject.toml

[project]
name = "myproject"
...
dynamic = ["dependencies", "optional-dependencies"]

[tool.setuptools.dynamic]
dependencies = { file = ["requirements.txt"] }

[tool.setuptools.dynamic.optional-dependencies]
dev = { file = ["requirements-dev.txt"] }
Run Code Online (Sandbox Code Playgroud)

使用 pip 安装

当前结构与 pip 完美配合,包括可编辑的安装和/或可选的依赖项:

# local installation of the package:
pip install .

# editable install:
pip install -e .

# editable install with optional dependencies:
pip install -e `.[dev]`
Run Code Online (Sandbox Code Playgroud)

使用 conda 安装

使用 conda 时事情并不那么简单。从头开始创建环境时:

conda create -n ENVNAME "python>=3.11" --file requirements.txt
Run Code Online (Sandbox Code Playgroud)

如果添加到已建立的环境,请使用update

conda update --name ENVNAME --file requirements.txt
Run Code Online (Sandbox Code Playgroud)

如果安装第二组依赖项(例如,存储在 中的开发依赖项requirements-dev.txt),您可能不希望它们影响原始依赖项(例如,您将测试稍微不同的包)。您可以使用以下方法冻结它们freeze-installed

conda update --name ENVNAME --freeze-installed --file requirements-dev.txt
Run Code Online (Sandbox Code Playgroud)

最后,通过 conda 处理所有依赖项,可以使用 将该包安装到环境中pip

pip install --no-build-isolation --no-deps .
Run Code Online (Sandbox Code Playgroud)

--no-deps和标志对于防止 pip 干扰 conda 维护的环境是必要的--build-isolation