如何使用 conda-build 构建具有 C/C++ 依赖项的 Python 包
图片来源 Mahe Iram Khan
conda-build 是一款自动化构建和分发 Python 包的应用程序。它是一个功能强大的工具,可以处理需要 C/C++ 或其他语言的依赖项。这对于科学计算特别有用,因为许多 Python 包具有复杂的依赖项,需要专门的库和工具。
一个配方概述了从源代码构建包所需的步骤。我们可以使用 grayskull
创建这个“配方”。配方包含所有必要的信息,从下载和安装依赖项到编译源代码和创建最终包。Conda-build 然后呈现配方以构建包。一个配方通常包括
- 包含元数据的脚本。
- 在 macOS 和 Linux 上安装包文件的脚本。
- 在 Windows 上安装包文件的构建脚本。
- 任何其他设置文件,具体取决于包的复杂性。
在这篇文章中,我们将指导您完成使用 conda-build 构建 Python 包的过程!conda-build 可以帮助我们处理包最复杂的依赖项,使构建过程更加流畅和高效。让我们准备好构建一个很棒的 Python 包吧!
入门
先决条件
让我们开始构建我们自己的 Python 包。首先,您需要确保您拥有一个功能正常的 conda 安装(例如,通过 Miniconda 或 Miniforge)。然后,您可以使用 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 可以用作满足您所有包管理需求的一站式解决方案。