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

Ben*_*mer 3 c++ python setuptools extension-modules pybind11

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

通过 CMake 我设法获得了一个包含要构建的接口函数的共享库,但是现在我有了它我不知道如何告诉 Python 它存在并使其可导入。我不想重新配置要通过 Python 启动的整个项目构建(即如这里使用 setuptools 所述),因为它是一个大项目,我只是为它的一部分提供了一个 Python 接口。因此,如果我可以只为 Python 构建共享库以及其余的 C++ 代码,然后再运行“setup.py install”来执行其他任何需要使共享库可见的操作,那就更好了到 Python。

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

Rom*_*nko 5

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

from setuptools import setup

setup(
    name='foo',
    version='0.1.2.3',
    py_modules=['foo']
)
Run Code Online (Sandbox Code Playgroud)

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

include foo.so
Run Code Online (Sandbox Code Playgroud)

所以你需要3个文件:

foo.so
MANIFEST.in
setup.py
Run Code Online (Sandbox Code Playgroud)

现在您可以python setup.py install在您的 Python 虚拟环境中执行操作,并且您的二进制模块将安装在其中。如果你想分发你的模块,那么最好安装 Pythonwheel包并创建一个.whl文件:python setup.py bdist_wheel. 这样的“轮子”以后可以用pip命令安装。请注意,二进制模块必须安装在用于构建这些模块的相同平台和 Python 版本上。