【发布时间】: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