跳至主要内容

如何使用 conda-build 构建具有 C/C++ 依赖项的 Python 包

·阅读时长:5 分钟
Vasvi Sood
开源贡献者

图片来源 Mahe Iram Khan


conda-build 是一款自动化构建和分发 Python 包的应用程序。它是一个功能强大的工具,可以处理需要 C/C++ 或其他语言的依赖项。这对于科学计算特别有用,因为许多 Python 包具有复杂的依赖项,需要专门的库和工具。

一个配方概述了从源代码构建包所需的步骤。我们可以使用 grayskull 创建这个“配方”。配方包含所有必要的信息,从下载和安装依赖项到编译源代码和创建最终包。Conda-build 然后呈现配方以构建包。一个配方通常包括

  • 包含元数据的脚本。
  • 在 macOS 和 Linux 上安装包文件的脚本。
  • 在 Windows 上安装包文件的构建脚本。
  • 任何其他设置文件,具体取决于包的复杂性。

在这篇文章中,我们将指导您完成使用 conda-build 构建 Python 包的过程!conda-build 可以帮助我们处理包最复杂的依赖项,使构建过程更加流畅和高效。让我们准备好构建一个很棒的 Python 包吧!

入门

先决条件

让我们开始构建我们自己的 Python 包。首先,您需要确保您拥有一个功能正常的 conda 安装(例如,通过 MinicondaMiniforge)。然后,您可以使用 conda 安装 conda-build。

安装 conda-build

conda-build 通常安装在您的 base 环境中,与 conda 并排。

$ conda install -n base conda-build

创建配方模板

在本教程中,我们将逐步介绍使用 Grayskull 为 PyPI 的 click 包构建配方的过程。Grayskull 是一个自动化的 conda 配方生成器,用于为 PyPI 上的 Python 包和 GitHub 上可用的非 PyPI 包创建配方。PyPI 是互联网上 Python 包的众多存储库之一。

$ conda install grayskull
$ grayskull pypi click
注意

您可以使用 PyPI 上提供的任何包,而不是 click

执行此命令后,将生成一个名为 click 的新目录。在此目录中,您将找到一个名为 meta.yaml 的文件。此文件包含创建 conda 包所需的所有元数据,例如包名称、版本号、源代码 URL、安装说明、依赖项、许可证等。请注意,如果您没有使用 grayskull 命令,则需要手动编写脚本。您可以对 meta.yaml 文件进行任何更改,并将自己添加为您的包的维护者和分发者。

构建包

要构建您的 click 包,请从根文件夹运行此命令。

$ conda build click

构建过程完成后,conda-build 将在 conda-bld 目录中生成一个包文件。要找到此文件,您可以从终端使用此命令。

$ conda build click --output

您现在可以通过在终端中运行此命令来在本地安装包。

$ conda install --use-local click

恭喜🎊🎉,您已经成功下载了自己的包!您可以修改此包并将其上传到 Anaconda.org

构建具有 C/C++ 依赖项的包

使用 conda-build,包含非 Python 包非常简单。在本例中,我们将添加 gcc 作为构建依赖项,并将 mylib 作为运行时依赖项。我们还将添加一个新步骤,将 mylib.cpp 编译成一个名为 mylib.so 的共享库。

meta.yaml 文件中,您可以包含以下内容,然后再次构建包。

build:
script:
- g++ -o mylib.so -shared -fPIC mylib.cpp
- cp mylib.so "{{ PREFIX }}/lib"

requirements:
build:
- gcc
run:
- mylib
注意

此示例出于教学目的而有意简化。它没有解决 host 依赖项、make 等构建工具、ABI 兼容性等。例如,conda-build 用户经常依赖 Jinja 模板来获取平台的正确编译器,而不是直接硬编码编译器(gcc)。

查看 compiler() 函数的文档。有关现实世界的示例,您可以查看 conda-forge 搜索 中的一些配方。

测试包

成功创建我们的包后,我们现在可以继续在我们的机器上创建另一个 conda 环境,并使用新创建的包。此外,我们还可以将包上传到 Anaconda.org 并分发给其他人或创建我们的频道。

要在我们的本地机器上安装包,我们将为我们的包创建一个新的 conda 环境,激活它,然后安装我们的包。您可以使用以下命令来执行此操作。

$ conda create -n test_env
$ conda activate test_env
$ conda install --use-local click

使用以下命令将您的包上传到 Anaconda.org

$ conda install -n base anaconda-client  # if you don't have it yet
$ anaconda upload /path/to/my_package-1.0-0.tar.bz2

您可以将您的包上传到您有权访问的任何现有频道,包括您为自己创建的频道,并将其分发给其他人。了解有关 创建自定义频道 的更多信息。

结论

总之,使用 conda-build 创建和管理 Python 包可以简化软件包分发和安装过程。使用 conda-build,您不必重新发明轮子或从头开始编写代码 - 相反,您可以依赖预构建的包,并轻松地将任何非 Python 依赖项集成到您的项目中。Conda-build 可以用作满足您所有包管理需求的一站式解决方案。