【问题标题】:Python + setuptools: distributing a pre-compiled shared library with boost.python bindingsPython + setuptools:分发带有 boost.python 绑定的预编译共享库
【发布时间】:2016-02-11 16:12:16
【问题描述】:

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

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

import libpyExample
libpyExample.hello_world()

这会执行包装过程中公开的hello_world() 函数。

我想做什么

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

import pyExample

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

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

我确实发现了很多关于使用 setuptools 编译 C++ 扩展的信息,但没有找到关于打包预编译 C++ 扩展的信息。我想做的甚至可能吗?

我不想做的事

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

【问题讨论】:

  • 正确的方法是将编译作为设置过程的一部分。如果是 C++ 代码,我会双重建议重新编译。
  • 我知道,但是这个库不是跨平台的,改变构建系统真的很复杂。我在浏览setuptools documentation 时发现了一个肮脏的解决方法。我只是 (1) 创建了一个包含用于命名空间重命名的 init 脚本的 pyExample 目录,(2) 将我的 libpyExample.so 文件注册为包数据文件(它未被识别为包文件,我不知道为什么) (3) 确保在调用setup 函数时将zip_safe 参数设置为False。现在,setup.py 按预期工作。

标签: python c++ boost setuptools


【解决方案1】:

如果我正确理解您的问题,您有以下情况:

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

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

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

https://github.com/pybind/cmake_example

查看setup.py,您将看到build_extExtension 类是如何继承自和修改以执行CMake 构建的。

这对你来说应该是开箱即用的,或者几乎不需要修改——如果你的构建需要设置特殊的-D 标志。 我希望这会有所帮助!

【讨论】:

  • 这并不能完全回答原始问题,实际上是遵循@Petesh 评论的逻辑。但是,根据经验(我在 2 多年前问过这个问题),我认为这确实是非常可行的,尤其是现在 pybind11 让事情变得如此简单。
  • 如果原始问题没有正确回答,您可以让我知道我误解了什么,然后我可以改进答案。 @Petesh 没有详细说明如何实现这一点。
  • 当我发布这个问题时,我想到的目标是手动编译 C++ 库(即通过从终端调用 CMake 和 Make),将生成的 .so 文件“手动”复制到Python 包文件树中的适当位置,并使用安装脚本将其安装到 Python 文件树中。您在答案中提出的建议更优雅,不需要修改构建过程,并且可以使用 pybind11 方便地实现。我认为它解决了我当时遇到的问题(我接受答案的原因)。
  • 啊,我明白了。抱歉,我的回答对您原来的问题来说来得太晚了,无论如何感谢您接受答案:)
猜你喜欢
  • 2016-09-15
  • 2013-07-15
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
相关资源
最近更新 更多