使用 C++ 扩展制作跨平台 PyPI 包(用 pybind11 包装,用 bazel 构建)

And*_*kin 5 pip pypi bazel pybind11

我有一个混合 C++/Python 项目。它使用pybind11包装 Python 的 C++ 代码,并使用 bazel来构建解决方案。我对这个技术栈非常满意。安装 C++ 编译器、Python 发行版和 bazel 后,bazel run命令即可下载依赖项、构建并运行整个 C++/absl/Python/numpy 集团。

但为了让用户的事情变得更简单,我想将我的代码打包为 PyPI 包,以便可以使用pip install. 我希望该包是跨平台的,可以在 Windows、Linux 和 MacOS 上运行。

在生成新版本时,建立构建、打包并将所有内容上传到 PyPI 的管道的最清晰方法是什么?

Wol*_*olf 0

这不是一个完美的答案,但受grpc 方法的启发,我已经在这个库中成功地使用了它。诀窍是通过 bazelisk.py 和 setup.py 调用 bazel,复制 bazel 输出文件,然后使用 pyproject.toml 文件打包 Python。

步骤(假设您的 bazel 代码已经构建):

  1. 添加一个可以调用 bazelisk.py 的 setup.py 并将二进制文件复制到正确的输出目录(参见12)。
  2. 在 pyproject.toml 中添加其他 Python 文件。在 MANIFEST.in 中添加任何非 Python 文件,以便 python 可以包含它们(请参见1)。
  3. 使用您的包创建 venv 并在 venv* 中运行测试。
  4. 设置 github 操作,用于安装包、构建二进制文件并在 venv 中运行测试。我在1中为此使用了 Makefile 。
  5. 使用 GitHub 的运行程序(请参阅1.github/workflows/*.yml中的文件),为所有目标平台构建 C++ 二进制文件,因此用户无需这样做。您可以将这些上传到 pip。使用矩阵构建来覆盖您目标的每个 Python 版本。您还可以为想要自己构建代码的任何人上传 sdist 构建。

*此步骤可以改进。