如何使用 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 可以用作满足您所有软件包管理需求的一站式解决方案。