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

问题描述 投票:0回答:1

我有一个混合 C++/Python 项目。它使用 pybind11 包装 Python 的 C++ 代码,并使用 bazel 构建解决方案。我对这个技术栈非常满意。安装 C++ 编译器、Python 发行版和 bazel 后,单个

bazel run
命令就可以下载依赖项、构建并运行整个 C++/absl/Python/numpy 集团。

但是为了让用户的事情变得更简单,我想将我的代码打包为 PyPI 包,以便可以使用

pip install
下载它。我希望该包是跨平台的,可以在 Windows、Linux 和 MacOS 上运行。

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

pip bazel pypi pybind11
1个回答
0
投票

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

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

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

*这一步还可以改进。

© www.soinside.com 2019 - 2024. All rights reserved.