如何导入或安装预先构建的python扩展模块(C ++)(即库未通过setuptools编译)?

时间:2017-11-21 08:11:56

标签: python c++ setuptools pybind11 extension-modules

我有一个C ++项目,我正在开发一个Python接口。现在我正在使用pybind11,因为它看起来非常整洁,并且有一些很好的工具可以用CMake构建扩展模块,这就是构建主要C ++项目的方式。

通过CMake我设法获得了一个包含要构建的接口函数的共享库,但是现在我已经拥有它了,我不知道如何告诉Python它存在并使其可导入。我不想重新配置要通过Python启动的项目的整个构建(即如here所述的setuptools),因为它是一个大项目,我只是提供一个Python接口来部分。因此,如果我可以为Python构建共享库以及其余的C ++代码,然后稍后运行" setup.py install"做任何其他事情都需要做,以使共享库对Python可见。

这可能吗?或者我是否需要进行其他类型的重构,例如让主项目构建一些其他纯C ++库,然后我只链接到通过setuptools单独构建的Python扩展模块库?

1 个答案:

答案 0 :(得分:2)

如果您只需安装一个二进制模块,则可以为该模块创建一个简单的安装程序。假设您已经使用cmake生成的构建脚本构建了二进制模块foo.so(如果您正在使用Windows,则为foo.pyd)。然后,您可以创建一个简单的设置设置脚本:

from setuptools import setup

setup(
    name='foo',
    version='0.1.2.3',
    py_modules=['foo']
)

然后您需要添加MANIFEST.in文件来选择二进制模块文件:

include foo.so

所以你需要3个文件:

foo.so
MANIFEST.in
setup.py

现在您可以从Python虚拟环境中执行python setup.py install,并在其中安装二进制模块。如果要分发模块,则最好安装Python wheel包并创建.whl文件:python setup.py bdist_wheel。稍后可以使用pip命令安装此类“轮”。请注意,二进制模块必须安装在用于构建这些模块的同一平台和Python版本上。