Python+setuptools:分发一个带有boost.Python绑定的预编译共享库

Python + setuptools: distributing a pre-compiled shared library with boost.python bindings

本文关键字:绑定 Python boost 共享 编译 一个 Python+setuptools      更新时间:2023-10-16

我有一个C++库(我们在下面称之为Example),我使用boost.Python库为其编写了Python绑定。这个Python封装的库将被称为pyExample。整个项目是使用CMake构建的,生成的Python封装库是一个名为libpyExample.so的文件。

当我使用与libpyExample.so位于同一目录中的Python脚本中的Python绑定时,我只需编写:

import libpyExample
libpyExample.hello_world()

并且这执行通过封装处理暴露的CCD_ 3功能。

我想做什么

为了方便起见,我希望我的pyExample库可以在任何地方使用,只需使用命令

import pyExample

我还希望pyExample只需一个命令就可以轻松地安装在任何虚拟机中。所以我认为一个方便的过程是使用setuptools来实现这一点。因此,这意味着:

  • 使libpyExample.so对任何Python脚本都可见
  • 更改访问模块的名称

我确实发现了很多关于使用setuptools编译C++扩展的东西,但没有发现任何关于打包预编译的C++扩展的内容。我想做的事情有可能吗?

我不想做的事

我不想用setuptools构建pyExample库,我希望避免对现有项目进行过多修改。CMake构建很好,我可以很容易地检索libpyExample.so文件。

如果我正确理解你的问题,你会遇到以下情况:

  • 您有一个现有的基于CMake的带有Python绑定的C++库构建
  • 你想用setuptools打包这个库

然后,后者允许您调用python setup.py install --user,它将lib安装在site-packages目录中,并使其在系统中的每个路径中都可用。

如果您重载setuptools用来构建扩展的类,使这些类实际调用CMake构建系统,那么您想要的是可能的。这并非微不足道,但您可以在这里找到一个由pybind11项目提供的工作示例:

https://github.com/pybind/cmake_example

深入了解setup.py,您将看到类build_extExtension是如何从中继承和修改以执行CMake构建的。

如果您的构建需要设置特殊的-D标志,那么这应该是开箱即用的,或者只需少量修改。我希望这能有所帮助!